1. 程式人生 > 實用技巧 >JavaWeb三大元件之 Filter&Listener

JavaWeb三大元件之 Filter&Listener

Servlet Filter Listener是JavaWeb的三大元件。

Filter

Servlet Filter Listener是JavaWeb的三大元件。

過濾器一般用於完成通用的操作,如:登入驗證、統一編碼、敏感字元過濾等

過濾器執行流程:

  • 客戶端請求資源-》對request過濾-》訪問資源-》對response過濾-》返給客戶端。

快速入門

和定義一個servlet相似:

  1. 定義一個類,實現介面Filter
  2. 重寫方法
  3. 配置攔截路徑 @WebFilter("/*") (對所有路徑過濾)
  4. 放行所有內容:doFilter方法中程式碼如下:
    • filterChain.doFilter(servletRequest, servletResponse);

過濾器配置

攔截路徑配置:

  • 具體資源路徑:@WebFilter(/index.jsp)
  • 目錄攔截:@WebFilter(/user/*)
  • 字尾名攔截:@WebFilter(*.jsp)
  • 攔截所有資源:@WebFilter(/*)

攔截方式配置:(設定dispatcherTypes屬性)

  • REQUEST: 預設值,瀏覽器直接請求資源時,攔截過濾
  • FORWARD: 轉發訪問資源時,攔截過濾
  • INCLUDE: 包含訪問資源(不講)
  • ERROR: 錯誤跳轉資源(不講)
  • ASYNC: 非同步訪問資源 (先不講,涉及到Ajax)

還可以攔截多個請求方式:

@WebFilter(value="/*",dispatcherTypes={DispatcherTypes.REQUEST, DispatcherTypes.FORWARD})

過濾器鏈

如果有多個過濾器,訪問資源前,按順序過濾;訪問資源後,按相反順序過濾。

過濾順序可以進行配置:

  1. 註解配置方式:按照類名的字串比較,值小的先執行
  2. web.xml配置方式
    • <filter-mapping></filter-mapping> 誰定義在上面,誰先執行

例1:登入

如果使用者登入,直接放行;如果沒有,跳轉到登入頁面。

@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
    // 轉成HttpServlet
    HttpServletRequest req = (HttpServletRequest) servletRequest;
    // 獲取資源請求路徑
    String uri = req.getRequestURI();
    // 判斷是否包含登陸相關資源:js,css,圖片等
    if (uri.contains("/login.jsp") || uri.contains("/loginServlet") || uri.contains("/css/")
    || uri.contains("/js/") || uri.contains("/fonts/")) {
        // 如果正在登陸,直接放行
        filterChain.doFilter(servletRequest, servletResponse);
    } else {
        // 訪問的是非登陸資源,判斷是否已經登陸
        Object user = req.getSession().getAttribute("user");
        if (user != null) {
            // 已經登陸, 直接放行
            filterChain.doFilter(servletRequest, servletResponse);
        } else {
            req.setAttribute("login_msg", "請先登陸");
            req.getRequestDispatcher("/login.jsp").forward(servletRequest, servletResponse);
        }
    }
}

Listener

(理論瞭解即可)

Servlet Filter Listener是JavaWeb的三大元件。

事件監聽機制:

  • 事件:一件事情(如:單擊、雙擊)
  • 事件源:事件發生的地方(如:按鈕、滑鼠、鍵盤)
  • 監聽器:一個物件
  • 註冊監聽:將事件、事件源、監聽器繫結在一起。

JavaWeb中有很多監聽器物件,學習其中一個:ServletContextListener

ServletContextListener:監聽ServletContext物件的建立和銷燬

  • void contextDestroyed: ServletContextListener物件被銷燬前呼叫該方法
  • void contextInitialized: ServletContextListener物件被建立後呼叫該方法

實現步驟:

  1. 定義一個類,繼承ServletContextListener類;
  2. 重寫上面的兩個方法;(如,建立物件後,載入專案全域性的配置檔案)
  3. 添加註解 @WebListener