SpringMvc的過濾器。
一:過濾器的原理:
過濾器放在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文件裏的規則如下:
1 <!-- 編碼處理過濾器 --> 2 3 <filter> 4 5 <filter-name>encodingFilter</filter-name> 6 7 <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class> 8 9 <init-param> 10 11 <param-name>encoding</param-name> 12 13 <param-value>utf-8</param-value> 14 15 </init-param> 16 17 <init-param> 18 19 <param-name>forceEncoding</param-name> 20 21 <param-value>true</param-value> 22 23 </init-param> 24 25 </filter> 26 27 28 29 <filter-mapping> 30 31 <filter-name>encodingFilter</filter-name> 32 33 <url-pattern>*.do</url-pattern> 34 35 </filter-mapping>
其中,filter-class 為過濾器Filter類,init-prama為註入的set參數
Filter-mapping中的url-pattern為過濾的url類型
- 設置編碼的核心代碼為
-
1 @Override 2 3 protected void doFilterInternal( 4 5 HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) 6 7 throws ServletException, IOException { 8 9 10 11 if (this.encoding != null && (this.forceEncoding || request.getCharacterEncoding() == null)) { 12 13 request.setCharacterEncoding(this.encoding); 14 15 if (this.forceEncoding) { 16 17 response.setCharacterEncoding(this.encoding); 18 19 } 20 21 } 22 23 filterChain.doFilter(request, response); 24 25 }
其中filterChain為過濾器鏈,表示執行完這個過濾器之後接著執行下一個過濾器
過濾器的運行是依賴於servlet容器的。所以配置在web.xml中。
攔截器是springmvc框架的。所以要配置在springmvc.xml文件中。
SpringMvc的過濾器。