Java Web開發——Filter過濾器,filter過濾器
一、過濾器
1.1定義
過濾器是一個伺服器端的組件,它可以截取使用者端的請求與響應資訊,並對這些資訊進行過濾。
1.2工作原理
1、項目啟動時,從Web容器中載入過濾器;
2、過濾器存在於使用者請求和Web資源之間;
3、使用者請求和Web響應之間的收發都經由過濾器按照過濾規則進行過濾篩選。
1.3過濾器的生命週期
執行個體化(web.xml載入)→初始化(init方法)→過濾(doFilter方法)→銷毀(destroy方法)
1、初始化:當容器第一次載入該過濾器時,init() 方法將被調用。該類在這個方法中包含了一個指向 Filter Config 對象的引用。我們的過濾器實際上並不需要這樣做,因為其中沒有使用初始化資訊,這裡只是出於示範的目的。
2、過濾:過濾器的大多數時間都消耗在這裡。doFilter方法被容器調用,同時傳入分別指向這個請求/響應鏈中的 Servlet Request、Servlet Response 和 Filter Chain 對象的引用。然後過濾器就有機會處理請求,將處理任務傳遞給鏈中的下一個資源(通過調用 Filter Chain 對象引用上的 doFilter方法),之後在處理控制權返回該過濾器時處理響應。
3、銷毀:容器緊跟在垃圾收集之前調用 destroy()方法,以便能夠執行任何必需的清理代碼。
過濾器鏈:伺服器會按照web.xml中過濾器定義的先後順序組裝成一條鏈
1.4過濾器在web.xml中的基本配置
過濾器在web.xml中的的配置:
<filter> <filter-name>過濾器名稱</filter-name> <filter-class>過濾器完整類名</filter-class> <init-param> <description>描述資訊,可以省略</description> <param-name>參數名稱</param-name> <param-value>參數值</param-value> </init-param></filter><filter-mapping> <filter-name>過濾器名稱</filter-name> <url-pattern>URL</url-pattern> <dispatcher>[REQUEST|INCLUDE|FORWARD|ERROR]</dispatcher></filter-mapping>
1.5過濾器的分類
過濾器的分類表
| 類型 |
作用 |
| REQUEST |
使用者直接存取頁面時,web容器會調用該過濾器 |
| FORWARD |
目標資源是通過RequestDispatcher的forward方法訪問時,過濾器將被調用 |
| INCLUDE |
目標資源是通過RequestDispatcher的include方法調用時,過濾器將被調用 |
| ERROR |
目標資源是通過聲明式異常處理機制調用時,過濾器被將被調用 |
| ASYNC(Servlet3.0新增加) |
支援非同步處理 |
二、過濾器的基本使用
2.1 過濾器類的設計
實現Filter介面,重寫init、doFilter、destroy方法
public class MyFilter implements Filter{ public void init(FilterConfig filterConfig) throws ServletException{} /** *使瀏覽器不快取頁面面的過濾器 */ public void doFilter(ServlerRequest request,ServletResponse response,FilterChain filterChian) throws IOException,ServletException{ ((HttpServletResponse) response).setHeader("Cache-Control","no-cache"); ((HttpServletResponse) response).setHeader("Pragma","no-cache"); ((HttpServletResponse) response).setDateHeader ("Expires", -1); filterChain.doFilter(request, response);//將處理任務傳遞給過濾器鏈中的下一個資源 } public void destroy(){}}
2.2 過濾器在web.xml中的註冊
1、REQUEST、FORWARD、INCLUDE等類型過濾器的註冊
<!-- 過濾器配置 --><filter> <filter-name>myFilter</filter-name> <filter-class>util.filter.MyFilter</filter-class></filter><filter-mapping> <filter-name>myFilter</filter-name> <url-pattern>/main.jsp</url-pattern> <dispatcher>[REQUEST|FORWARD|INCLUDE]</dispatcher></filter-mapping>
2、ERROR類型的過濾器註冊
<!-- 配置錯誤頁面,當出現404錯誤則跳轉至/error.jsp頁面 --><error-page> <error-code>404</error-code> <location>/error.jsp</location><error-page><!-- 過濾器配置 --><filter> <filter-name>errorFilter</filter-name> <filter-class>util.filter.ErrorFilter</filter-class></filter><filter-mapping> <filter-name>errorFilter</filter-name> <url-pattern>/error.jsp</url-pattern> <dispatcher>ERROR</dispatcher></filter-mapping>
三、Servlet3.0中過濾器的使用
加上 @WebFilter 註解即可,無需在web.xml中註冊
@WebFilter(servletNames={"SimpleServlet"},filterName="SimpleFilter")public class MyFirstFilter implements Filter{}
@WebFilter常用屬性工作表
| 屬性名稱 |
類型 |
描述 |
| filterName |
String |
指定過濾器的name屬性,等價於<filter-name> |
| value |
String[] |
等價於urlPatterns屬性,但是兩者不要同時使用,若同時使用,優先使用value屬性 |
| urlPatterns |
String[] |
指定一組過濾器的URL匹配模式,等價於<utl-pattern>標籤 |
| servletNames |
String[] |
指定過濾器將應用於哪些Servlet。取值是@WebServlet中的name屬性值,或者是web.xml中的<servlet-name>取值 |
| dispatcherTypes |
DispatcherType |
指定過濾器的轉寄模式。具體取值包括ASYNC、ERROR、FORWARD、INCLUDE、REQUEST |
| initParams |
WebInitParam[] |
指定一組過濾器初始化參數,等價於<init-param>標籤 |
| asyncSupported |
boolean |
聲明過濾器是否支援非同步作業模式,等價於<async-supported>標籤 |
| description |
String |
該過濾器的描述資訊,等價於<description>標籤 |
| displayName |
String |
該過濾器的顯示名,等價於<display-name>標籤 |