javaWeb學習十八天------監聽器,過濾器

Filter Listener Servlet 是 javaweb 的三大組件

監聽器

監聽某一個對象(內置對象)的狀態

狀態:

1.監聽內置對象的創建; ServletContext , request, session

2.監聽內置對象值的改變 ServletContext request session

3.監聽內置對象是否有存某一個固定的值 ==>主要是針對於session

監聽內置對象的創建

ServletContex

ServletContex是隨着服務器的創建而創建 ,隨着服務器的關閉而銷燬

步驟:
1.創建一個類  實現  ServletContextListener
  
2.重寫兩個方法 contextDestroyed(ServletContextEvent sce)  銷燬後所執行的方法 
             contextInitialized(ServletContextEvent sce) 初始化所執行的方法
3.在xml進行配置   或者是寫註解  @WebListener

xml配置

<listener>
        //完整的包名與類名
        <listener-class>com.study.listeren.MyServletContextListeren</listener-class>
    </listener>

實現ServletContextListener(使用註解,如果寫xml會優先加載xml配置)

@WebListener
public class MyServletContextListeren implements ServletContextListener {

    // 創建的時候所執行的方法
    @Override
    public void contextInitialized(ServletContextEvent servletContextEvent) {
        System.out.println("contextInitialized");
    }
  // 銷燬的時候所執行的方法
    @Override
    public void contextDestroyed(ServletContextEvent servletContextEvent) {
        System.out.println("contextDestroyed");

    }
}

request

request ==隨着請求的開始而開始,隨着請求的結束而結束(一次請求 )

步驟:
1.創建一個類  實現  ServletRequestListener
2.重寫其requestDestroyed(ServletRequestEvent sre)銷燬
       requestInitialized(ServletRequestEvent sre)  創建
3.配置註解 注意點(默認的tomcat會發動請求,==>看效果,直接重新訪問這個界面)

實現 ServletRequestListener

@WebListener
public class MyRequestListeren implements ServletRequestListener {
    @Override
    public void requestDestroyed(ServletRequestEvent servletRequestEvent) {
        System.out.println("requestDestroyed");
    }

    @Override
    public void requestInitialized(ServletRequestEvent servletRequestEvent) {
        System.out.println("requestInitialized");

    }
}

session

session ==>是隨着會話的創建而結果 ==>是30分鐘之後而關閉(如果不設置默認的時間)

 步驟:
 1.創建一個類  實現  HttpSessionListener
 2.重寫其sessionDestroyed(HttpSessionEvent se)銷燬  
        sessionCreated(HttpSessionEvent se  創建
 3.配置註解 注意點:只要關閉後三十分鐘 sessionId被清除

實現 HttpSessionListener

@WebListener
public class MySessionListeren implements HttpSessionListener {

    @Override
    public void sessionCreated(HttpSessionEvent httpSessionEvent) {
        System.out.println("sessionCreated");
    }

    @Override
    public void sessionDestroyed(HttpSessionEvent httpSessionEvent) {
        System.out.println("sessionDestroyed");

    }
}

監聽內置對象值的改變

1.監聽ServletContext對象值的改變 ==> 實現這個監聽 ServletContextAttributeListener

1.attributeAdded(ServletContextAttributeEvent scab)  追加                     
2.attributeRemoved(ServletContextAttributeEvent scab)  刪除
3.attributeReplaced(ServletContextAttributeEvent scab)  替換
@WebListener
public class MyServletContextAttributeListener implements ServletContextAttributeListener {

     // 添加至
    @Override
    public void attributeAdded(ServletContextAttributeEvent servletContextAttributeEvent) {
        System.out.println(servletContextAttributeEvent.getServletContext().getAttribute("uname"));
    }


    //刪除值

    @Override
    public void attributeRemoved(ServletContextAttributeEvent servletContextAttributeEvent) {
        System.out.println(servletContextAttributeEvent.getServletContext().getAttribute("uname"));
    }

    //替換值的時候

    @Override
    public void attributeReplaced(ServletContextAttributeEvent servletContextAttributeEvent) {
        System.out.println(servletContextAttributeEvent.getServletContext().getAttribute("uname"));
    }
}

2.監聽reques對象裏值的改變==> 實現這個監聽器 ServletRequestAttributeListener

1.attributeAdded(ServletContextAttributeEvent scab)  追加
2.attributeRemoved(ServletContextAttributeEvent scab)  刪除
3.attributeReplaced(ServletContextAttributeEvent scab)  替換
 注意點:在追加數據時候,默認會賦值一個null
@WebListener
public class MyRequestAttributeListener implements ServletRequestAttributeListener {
    @Override
    public void attributeAdded(ServletRequestAttributeEvent servletRequestAttributeEvent) {
        System.out.println("增加"+servletRequestAttributeEvent.getServletRequest().getAttribute("uname"));
    }

    @Override
    public void attributeRemoved(ServletRequestAttributeEvent servletRequestAttributeEvent) {
        System.out.println("刪除"+servletRequestAttributeEvent.getServletRequest().getAttribute("uname"));
    }

    @Override
    public void attributeReplaced(ServletRequestAttributeEvent servletRequestAttributeEvent) {
        System.out.println("修改"+servletRequestAttributeEvent.getServletRequest().getAttribute("uname"));
    }
}

3.監聽session 的值改變==> 實現 HttpSessionAttributeListener

1.attributeAdded(ServletContextAttributeEvent scab)  追加
2.attributeRemoved(ServletContextAttributeEvent scab)  刪除
3.attributeReplaced(ServletContextAttributeEvent scab)  替換
@WebListener
public class MySessionAttributeListener implements HttpSessionAttributeListener {


    @Override
    public void attributeAdded(HttpSessionBindingEvent httpSessionBindingEvent) {
        System.out.println("增加"+httpSessionBindingEvent.getSession().getAttribute("uname"));
    }

    @Override
    public void attributeRemoved(HttpSessionBindingEvent httpSessionBindingEvent) {
        System.out.println("刪除:"+httpSessionBindingEvent.getSession().getAttribute("uname"));
    }

    @Override
    public void attributeReplaced(HttpSessionBindingEvent httpSessionBindingEvent) {
        System.out.println("替換:"+httpSessionBindingEvent.getSession().getAttribute("uname"));
    }
}

4.HttpSessionActivationListener == >防止內存中的數據丟失

 sessionWillPassivate(HttpSessionEvent se)  
 鈍化  ==>工業:把一些液體固體化        硬盤  == 內存
 sessionDidActivate(HttpSessionEvent se)  活化  =>把固體化的物質解化
  鈍化:也就是把內存中數據保存在磁盤 1.把對象存在session    
  活化 :把磁盤中的數據加載到內存
  注意點 1.要依賴於流,對象必須實現序列化的接口  2.不需要給注 3.不需要新建一個類    4. 在idea中需要配置
public class Person implements Serializable,HttpSessionActivationListener {
     private  String  pname;

    public String getPname() {
        return pname;
    }

    public void setPname(String pname) {
        this.pname = pname;
    }

    // 鈍化
    @Override
    public void sessionWillPassivate(HttpSessionEvent httpSessionEvent) {
        System.out.println("sessionWillPassivate");
    }
   //活化
    @Override
    public void sessionDidActivate(HttpSessionEvent httpSessionEvent) {
        System.out.println("sessionDidActivate");

    }
}

HttpSessionBindingListener 監聽對象是否綁定在session==>也就是是否把這個對象存到session 裏

valueBound()  表示綁定了
valueUnbound() 表示解綁了
1.不需要給注 2.不需要新建一個類

代碼

public class Student implements Serializable,HttpSessionBindingListener {
    @Override
    public void valueBound(HttpSessionBindingEvent httpSessionBindingEvent) {
        System.out.println("被綁定了");
    }

    @Override
    public void valueUnbound(HttpSessionBindingEvent httpSessionBindingEvent) {
        System.out.println("解綁了");

    }
}

過濾器:Filter

程序中的過濾器跟生活中的定義一下  1.過濾: 過濾編碼格式    2.對某些請求進行過濾
使用的一個步驟(與使用servlet的步驟是一樣的):
1.寫一個類  實現過濾這個接口
2.實現其抽象方法 
               init()filter 初始化所執行的方法
               doFilter() 滿足過濾條件的一切請求與響應都會執行這個方法                                                    
               filterChain.doFilter(servletRequest,servletResponse); 一定放行
               destroy() 銷燬的方法
 
3.在web.xml 進行配置  或者配置註解     
@WebFilter(filterName = "encodingFilter",urlPatterns = "/*")   加載的順序是按照名字來進行排序的

import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import java.io.IOException;
@WebFilter(filterName = "encodingFilter",urlPatterns = "/*")
public class EncodingFilter  implements Filter {
    //filter 初始化的時候執行
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        System.out.println("init");
    }
      //滿足過濾條件的請求與響應都會執行
    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
         servletRequest.setCharacterEncoding("UTF-8");
         servletResponse.setCharacterEncoding("UTF-8");
         servletResponse.setContentType("text/html;charset=utf-8");
        System.out.println("doFilter");
        //放行
        filterChain.doFilter(servletRequest,servletResponse);
    }
  // 銷燬的時候執行
    @Override
    public void destroy() {
        System.out.println("destroy");
    }
}

@WebFilter(filterName = "userFilter",urlPatterns = "/admin/*")//過濾條件
public class UserFilter implements Filter {
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {

    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {//對符合過濾條件的請求進行處理
          // 首先把 ServletRequest 轉化爲HttpServletRequest
        HttpServletRequest  request  = (HttpServletRequest) servletRequest;
       HttpSession httpSession  =  request.getSession();
        if(httpSession.getAttribute("uname") !=null){
            //正常放行
            filterChain.doFilter(servletRequest,servletResponse);//處理完成放行
        }else{
              System.out.println("123455");
            //回到index.jsp
              request.setAttribute("msg","非法訪問");
              request.getRequestDispatcher("../index.jsp").forward(servletRequest,servletResponse);
        }

    }

    @Override
    public void destroy() {

    }
}

過濾器鏈

一個請求與響應的路上存在多個過濾器 ==> 過濾器鏈執行的過程

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章