SpringMVC 過濾器Filter使用解析
1.如上所示的spring-web.jar包結構所示, Spring的web包中中提供有很多過濾器,這些過濾器位於org.springframework.web.filter並且理所當然地實現了javax.servlet.Filter,
2.
不過實現的方式有以下幾類:
(1) 直接實現Filter,這一類過濾器只有CompositeFilter;
(2) 繼承抽象類GenericFilterBean,該類實現了javax.servlet.Filter,這一類的過濾器只有一個,即DelegatingFilterProxy;
(3) 繼承抽象類OncePerRequestFilter,該類為GenericFilterBean的直接子類,這一類過濾器包括CharacterEncodingFilter、HiddenHttpMethodFilter、HttpPutFormContentFilter、RequestContextFilter和ShallowEtagHeaderFilter;
(4) 繼承抽象類AbstractRequestLoggingFilter,該類為OncePerRequestFilter的直接子類,這一類過濾器包括CommonsRequestLoggingFilter、Log4jNestedDiagnosticContextFilter和ServletContextRequestLoggingFilter。
不過實現的方式有以下幾類:
(1) 直接實現Filter,這一類過濾器只有CompositeFilter;
(2) 繼承抽象類GenericFilterBean,該類實現了javax.servlet.Filter,這一類的過濾器只有一個,即DelegatingFilterProxy;
(3) 繼承抽象類OncePerRequestFilter,該類為GenericFilterBean的直接子類,這一類過濾器包括CharacterEncodingFilter、HiddenHttpMethodFilter、HttpPutFormContentFilter、RequestContextFilter和ShallowEtagHeaderFilter;
(4) 繼承抽象類AbstractRequestLoggingFilter,該類為OncePerRequestFilter的直接子類,這一類過濾器包括CommonsRequestLoggingFilter、Log4jNestedDiagnosticContextFilter和ServletContextRequestLoggingFilter。
過濾器放在容器結構的什么位置?
過濾器放在web資源之前,可以在請求抵達它所應用的web資源(可以是一個Servlet、一個Jsp頁面,甚至是一個HTML頁面)之前截獲進入的請求,並且在它返回到客戶之前截獲輸出請求。Filter:用來攔截請求,處於客戶端與被請求資源之間,目的是重用代碼。Filter鏈,在web.xml中哪個先配置,哪個就先調用。在filter中也可以配置一些初始化參數。
Java中的Filter 並不是一個標准的Servlet ,它不能處理用戶請求,也不能對客戶端生成響應。 主要用於對HttpServletRequest 進行預處理,也可以對HttpServletResponse 進行后處理,是個典型的處理鏈。
Filter 有如下幾個種類:
l 用戶授權的Filter: Filter 負責檢查用戶請求,根據請求過濾用戶非法請求。
l 日志Filter: 詳細記錄某些特殊的用戶請求。
l 負責解碼的Filter: 包括對非標准編碼的請求解碼。
l 能改變XML 內容的XSLTFilter 等。
Filter 有如下幾個用處 :
l 在HttpServletRequest 到達Servlet 之前,攔截客戶的HttpServletRequest 。
l 根據需要檢查HttpServletRequest ,也可以修改HttpServletRequest 頭和數據。
l 在HttpServletResponse 到達客戶端之前,攔截HttpServletResponse 。
l 根據需要檢查HttpServletResponse ,可以修改HttpServletResponse 頭和數據。
創建一個 Filter 只需兩個步驟
:
(1)創建Filter 處理類:
(2)在web.xml 文件中配置Filter 。
創建Filter 必須實現javax.servlet.Filter 接口,在該接口中定義了三個方法。
• void init(FilterConfig config): 用於完成Filter 的初始化。
• void destroy(): 用於Filter 銷毀前,完成某些資源的回收。
• void doFilter(ServletRequest request, ServletResponse response,FilterChain chain): 實現過濾功能,該方法就是對每個請求及響應增加的額外處理。
過濾器Filter也具有生命周期:init()->doFilter()->destroy(),由部署文件中的filter元素驅動。
參照編碼過濾器示例來查看怎么實現的
- 首先配置在web.xml文件里的規則如下