Filter
Servlet, Filter, Listener稱為Java Web的三大組件
Filter: 過濾器
當瀏覽器訪問服務器資源時和響應返回時,過濾器可以將請求攔截下來,完成一些特殊功能
用途: 一般用於完成通用操作:如登錄驗證,統一編碼處理,敏感字符過濾…
1. Filter實現
- 定義一個類,實現Filter接口
- 覆寫方法
- 配置攔截路徑
- 配置WEB-INF中的xml
- 用注解配置路徑:@WebFilter(urlPatterns=””)或@WebFilter(value=””)或@WebFilter(””)
- 配置WEB-INF中的xml
2. Filter原理
- Filter執行流程
- 請求過濾:執行放行doFilter上的代碼
- 放行:執行doFilter,攔截的資源被執行
- 響應過濾:攔截的資源做出響應后,回來執行doFilter下邊的代碼
- Filter生命周期
- init():初始化
在服務器啟動后,創建Filter對象,執行init方法。
只執行一次。一般用於加載資源。
- doFilter():請求過濾,響應過濾。
- destroy():銷毀
在服務器正常關閉時調用,一般用於釋放資源
- init():初始化
- 過濾器攔截路徑
- 攔截資源:/index.jsp, /loginServlet
只有訪問具體資源時,過濾器才會被執行
2. 攔截目錄:/user/*
只有訪問/user下的資源時,過濾器才會被執行
3. 后綴名攔截:*.jsp (沒有/)
4. 攔截所有資源:/*
- 過濾器的攔截方式:資源的訪問方式
- 注解配置:配置dispatcherType屬性
- REQUEST: 默認值,資源被瀏覽器直接訪問時,才被攔截
- FORWARD: 轉發訪問這個資源時,才被攔截
- INCLUDE:包含訪問資源時,才被攔截
- ASYNC:異步訪問資源時,才被攔截
@WebFilter(dispatcherType={DispatcherType.REQUEST, DispatcherType.FORWARD});
2. xml配置
- 攔截鏈
- 執行順序:請求過濾按先后順序由小到大執行,響應順序則正好相反
All filter... (@WebFilter(/*))
hello Filter... (@WebFilter(/hello.jsp))
你好,JSP (hello.jsp)
hello Filter back...
All filter…
2. 過濾器的先后順序
* 注解配置:- 按字符串比較規則,由小到大執行。
如:/*先於/login.jsp執行
- 如果有重復,則從小到大覆蓋執行
如:/* 和 /login.jsp在請求login.js時都執行過濾
* web.xml配置:誰在上,誰先執行
- 登錄案例
- 訪問案例的資源。驗證其是否登錄
- 如果登錄了,則直接放行。
- 如果沒有登錄,則跳轉到登錄頁面,提示"您尚未登錄,請先登錄"。
@WebFilter("/*") public class LoginFilter implements Filter { @Override public void init(FilterConfig config) throws ServletException { } @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws ServletException, IOException { HttpServletRequest request1=(HttpServletRequest) request; String uri=request1.getRequestURI(); //注意:要過濾資源,否則樣式和字體等login的資源不顯示 if(uri.contains("/login.jsp") || uri.contains("/loginServlet") || uri.contains("/css/") || uri.contains("/fonts/") || uri.contains("/js/") || uri.contains("/checkCodeServlet")) { chain.doFilter(request, response); } else { String userName= (String) request1.getSession().getAttribute("username"); if(null != userName && !"".equals(userName)) { chain.doFilter(request, response); }else { request.setAttribute("loginMsg","您未登錄,請登錄!"); request.getRequestDispatcher("/hellouser/login.jsp").forward(request, response); } } } }