Filter :
Java中的Filter 並不是一個標准的Servlet ,它不能處理用戶請求,也不能對客戶端生成響應。 主要用於對HttpServletRequest 進行預處理,也可以對HttpServletResponse 進行後處理,是個典型的處理鏈。
過濾鏈的好處是,執行過程中任何時候都可以打斷,只要不執行chain.doFilter()就不會再執行後面的過濾器和請求的內容。
1、filter的驅動:
在 web 應用程序啟動時,web 服務器將根據 web.xml 文件中的配置信息來創建每個注冊的 Filter 實例對象,並將其保存在服務器的內存中
<filter>
<filter-name>helloFilter</filter-name>
<filter-class>com.jalja.filter.HelloFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>helloFilter</filter-name>
<!-- 要攔截的資源 -->
<url-pattern>/freeMark</url-pattern>
</filter-mapping>
2、filter接口:
//destory() 在Web容器卸載 Filter 對象之前被調用。該方法在Filter的生命周期中僅執行一次。在這個方法中,可以釋放過濾器使用的資源。
public void destroy()
//Filter 鏈的執行
//chain.doFilter(request, response);//把請求傳給下一個filter,如果該filter是該filter鏈的最後一個filter,則把請求給目標資源
public void doFilter(ServletRequest request, ServletResponse response,FilterChain chain)
//類似於servlet的init方法,在創建Filter對象時被調用,只調用一次,對當前的filter進行初始化操作,filter單例
//FilterConfig 類似於servletConfig 可以獲得Filter的初始化參數信息
public void init(FilterConfig filterConfig)
3、filter 攔截順序:
web.xml中配置多個filter時構成filter鏈,他們的攔截順序取決於<filter-mapping>的順序
4、filter默認過濾的是 請求資源,如果是 其他方式的請求則過濾器無效 ,如果要使用就要在<filter-mapping>中添加<dispatcher>來指定過濾方式
<dispatcher>REQUEST</dispatcher>
<dispatcher>FORWARD</dispatcher>
<dispatcher>INCLUDE</dispatcher>
<dispatcher>ERROR</dispatcher>