JavaWeb三大元件之 Filter&Listener
阿新 • • 發佈:2020-08-15
Servlet Filter Listener是JavaWeb的三大元件。
Filter
Servlet Filter Listener是JavaWeb的三大元件。
過濾器一般用於完成通用的操作,如:登入驗證、統一編碼、敏感字元過濾等
過濾器執行流程:
- 客戶端請求資源-》對request過濾-》訪問資源-》對response過濾-》返給客戶端。
快速入門
和定義一個servlet相似:
- 定義一個類,實現介面Filter
- 重寫方法
- 配置攔截路徑
@WebFilter("/*")
(對所有路徑過濾) - 放行所有內容: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})
過濾器鏈
如果有多個過濾器,訪問資源前,按順序過濾;訪問資源後,按相反順序過濾。
過濾順序可以進行配置:
- 註解配置方式:按照類名的字串比較,值小的先執行
- 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物件被建立後呼叫該方法
實現步驟:
- 定義一個類,繼承ServletContextListener類;
- 重寫上面的兩個方法;(如,建立物件後,載入專案全域性的配置檔案)
- 添加註解
@WebListener