1. 程式人生 > 實用技巧 >java---過濾器、監聽器

java---過濾器、監聽器

一、過濾器(Filter)

  1、過濾器作用

    能夠對目標資源的請求和響應進行過濾或攔截,主要功能是登入驗證、編碼處理

    javaWeb三大元件:servelt、Filter、Listener(監聽器)

  2、使用入門

    ①建立類實現Filter介面 ②重寫介面中的方法 ③配置需要過濾的路徑 ④在doFilter中寫邏輯判斷,使用filterChain對符合條件的放行

@WebFilter("/*")   //使用註解配置需要過濾的路徑
public class FilterDemo2 implements Filter {
    @Override
    public
void init(FilterConfig filterConfig) throws ServletException { } @Override public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { System.out.println("進入過濾器了"); filterChain.doFilter(servletRequest,servletResponse);
//對請求或響應放行 } @Override public void destroy() { } }

    使用配置檔案配置需要過濾的路徑: web.xml

   <filter>
        <filter-name>filterDemo2</filter-name>
        <filter-class>com.fy.danbiao.Filter.FilterDemo2</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>filterDemo2</filter-name>
        <url-pattern>/*
</url-pattern> </filter-mapping>

  3、過濾器的細節

    ①過濾器的執行流程

      資源請求----》過濾器-----》放行-----》資源-----》響應-----》過濾器-----》客戶端

    ②生命週期

      和servlet相似:

      init():初始化

      doFilter():放行方法

      destory():銷燬

    ③過濾器配置

      訪問路徑配置:

        過濾所有路徑:/*

        過濾指定目錄的路徑:/user/*

        過濾指定結尾符:.jsp、.do

        過濾具體的資源路徑:index.jsp

      訪問的請求型別設定:dispatherTypes屬性,預設是request

        request:請求型別,預設值

        forward:轉發訪問資源

        include:包含訪問資源

        error:錯誤跳轉資源

        async:非同步訪問資源

        配置方式:①註解:@WebFilter(value = "/*",dispatcherTypes = DispatcherType.INCLUDE)

             ②配置檔案:

<filter>
        <filter-name>filterDemo2</filter-name>
        <filter-class>com.fy.danbiao.Filter.FilterDemo2</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>filterDemo2</filter-name>
        <url-pattern>/*</url-pattern>
        <dispatcher>INCLUDE</dispatcher>
    </filter-mapping>

      ④過濾器鏈的執行(當專案中有多個過濾器時)

        客戶端請求---》過濾器1---》過濾器2---》資源執行---》過濾器2---》過濾器1

        如何判斷那個過濾器先執行?兩種方式

          ①web.xml中配置的過濾器,那個先配置,那個先執行。

           ②根據過濾器類名來比較,類名的每個字元一次比較碼值,小的先執行

  4、過濾器案例:判斷訪問者是否登入,如果登入,就放行,沒有登入,跳轉到登入頁面

@WebFilter("/*")
public class FilterDemo implements Filter {
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        System.out.println("過濾器初始化");
    }

    /*實現:
     *1、判斷使用者是否登入,如果沒有登入,就跳轉倒login.jsp頁面,如果登陸了,跳轉到index.jsp
     *2、設定請求和相應的編碼
     * */
    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        HttpServletRequest req = (HttpServletRequest) servletRequest;
        HttpServletResponse resp = (HttpServletResponse) servletResponse;
//        1、設定編碼格式
      req.setCharacterEncoding("utf-8");
      resp.setContentType("text/html;charset=utf-8");
//      2、過濾請求
        String requestURI = req.getRequestURI();//獲取訪問的路徑
//         有些路徑不用攔截,就直接放行了   目前包括跳轉到 登入頁面/登入請求/靜態資源
        if(requestURI.contains("login.jsp") || requestURI.contains("login") ||requestURI.contains("lay")){
            filterChain.doFilter(req,resp);
        }else {
//            獲取session物件
            HttpSession session = req.getSession();
//            得到session物件中的值
            Object t_staff = session.getAttribute("t_staff");
            System.out.println("t_staff"+t_staff);
            if(t_staff!=null){
                filterChain.doFilter(req,resp);
            }else {
                resp.sendRedirect("/layui/login.jsp");
            }
        }


    }

    @Override
    public void destroy() {

    }
}
View Code

二、監聽器(Listener)

  1、作用:監聽web應用,監聽很多資訊的初始化、銷燬,屬性的新增、移除、修改

  2、監聽器的分類

    一個web應用程式的整個執行週期中,會建立和銷燬三個重要的物件:

        ServletContext、HttpSession、ServletRequest

    按監聽的物件,可劃分為:

        ServletContext物件監聽器:ServletContextListener、ServletContextAttributeListener

        HttpSession物件監聽器:HttpSessionListener、HttpSessionAttributeListener

        ServletRequest物件監聽器:ServletRequestListener、ServletRequestAttributeListener

    按監聽事件的劃分:

        物件的建立和銷燬的監聽

        物件中屬性的新增、修改、移除的監聽

        session中某個物件的狀態變化的監聽器

  3、使用

    ①實現指定監聽器的介面

    ②重寫方法

    以HttpSessionListener舉例:

@WebListener //配置監聽器
public class ListenerDemo2 implements HttpSessionListener {
    @Override
    public void sessionCreated(HttpSessionEvent se) {
        System.out.println("session建立");
    }
    
    @Override
    public void sessionDestroyed(HttpSessionEvent se) {
        System.out.println("session銷燬");
    }
}

  使用web.xml配置檔案來配置監聽器:

  <listener>
    <listener-class>com.fy.danbiao.listener.ListenerDemo2</listener-class>
  </listener>

4、監聽系統的線上人數(使用ServletContextListener、HttpSessionListener) 

@WebListener
public class ListenerDemo implements ServletContextListener,HttpSessionListener {
    ServletContext application;

    @Override
    public void contextInitialized(ServletContextEvent servletContextEvent) {
//        獲取上下文物件
        application = servletContextEvent.getServletContext();
//         是否有計數器
        if(application.getAttribute("count")==null){
//            存進去,只執行一次
            application.setAttribute("count",0);
        }
    }

    @Override
    public void contextDestroyed(ServletContextEvent servletContextEvent) {
    }

    @Override
    public void sessionCreated(HttpSessionEvent httpSessionEvent) {
//        獲取先前的線上人數,為什麼要把線上人數放在ServletContext,因為再HttpSession中只能存在30分鐘
        int count = Integer.parseInt(application.getAttribute("count").toString());
        count++;
        application.setAttribute("count",count);
    }

    @Override
    public void sessionDestroyed(HttpSessionEvent httpSessionEvent) {
        Integer count=Integer.valueOf(application.getAttribute("count").toString());
        count--;
        System.out.println(count);
        application.setAttribute("count",count);
    }
}