Filter的主要作用于對用戶進行預處理,也可以對HttpServletResponse進行后處理,是個典型的吃力鏈。使用Filter的完整流程:Fileter對用戶請求進行預處理,接著把請求交個Servlet進行處理并生成響應,最后Filter再對服務器響應進行后處理。
Filter的用處:
- 在HttpServletRequest到達Servlet之前,來接客戶的HttpServletRequest。
- 根據需要檢查HttpServletRequest,也可以修改HttpServletRequest頭和數據。
- 在HttpServletResponse到達客服端之前,攔截HttpServletResponse。
- 根據需要檢查HttpServletResponse,也可以修改HttpServletResponse頭和數據。
Filter的種類:
- 用戶授權的Filter:Filter負責檢查用戶請求,根據請求過濾用戶非法請求。
- 日志Filter:詳細記錄某些特殊的用戶請求。
- 負責解碼的Filter:包括對非標準編碼的請求解碼。
- 能改變XML內容的XSLT Filter等。
- Filter可負責攔截多個請求或響應,一個請求或響應也可被多個Filter攔截。
創建Filter的兩步:
- 創建Filter處理類。
- web.xml文件中配置Filter。
2.1創建Filter類
創建Filter必須實現javax.servlet.Filter接口,該接口中定義了三個方法:
- void init(FilterConfig config):用于完成Filter的初始化。
- void destroy():用于Filter銷毀前,完成某些資源的回收。
- void doFilter(ServletRequest request,ServletResponse response,FilterChain chain):實現過濾功能,該方法就是對每個請求及相應增加的額外處理。
2.2配置Filter
- 配置Filter名。
- 配置Filter攔截URL模式。
Servlet和Filter的區別:Servlet通常只配置一個URL,而Filter可以同時攔截多個請求的URL。因此在配置Filter的URL模式時通常會使用模式字符串,使得Filter可以攔截多個請求。
配置Filter的兩種方式:
- 在Filter類中通過注解來配置。
- 在web.xml中通過配置文件進行配置。
web.xml
<!--定義Filter-->
<filter>
<!--Filter的名字,相當于指定@WebFilter的filtername屬性-->
<filter-name>log</filter-name>
<!--Filter的實現類-->
<filter-class>lee.LogFilter</filter-class>
</filter>
<!--定義Filter攔截URL地址-->
<filter-mapping>
<filter-name>log</filter-name>
<!--Filter負責攔截的URL,相當于指定@WebFilter的urlPatterns屬性-->
<utl-pattern>/*<utl-pattern>
</filter-mapping>
web.xml中為Filter配置參數:
<!--定義Filter-->
<filter>
<!--Filter的名字,相當于指定@WebFilter的filtername屬性-->
<filter-name>log</filter-name>
<!--Filter的實現類-->
<filter-class>lee.LogFilter</filter-class>
<!--為Filter配置參數-->
<init-param>
<param-name>encoding</param-name>
<param-value>GBK</param-value>
</init-param>
</filter>
<!--定義Filter攔截URL地址-->
<filter-mapping>
<filter-name>log</filter-name>
<!--Filter負責攔截的URL,相當于指定@WebFilter的urlPatterns屬性-->
<utl-pattern>/*<utl-pattern>
</filter-mapping>
2.3使用URL Rewrite實現網站偽靜態
對于Java Web應用來說,要實現偽靜態:可以通過Filter攔截所有發向.html請求,然后按照某種規則將請求forward到實際的.jsp頁面。**
URL Rewrite實現網站偽靜態:
- 登錄http://code.google.com/p/urlrewritefilter/downloads/list 站點下載Url Rewrite。
- 下載URL Rewrite。直接下載他的urlrewritefilter-4.0.3.jar即可,并將該jar報復制到Web應用的WEB-INF\lib目錄下。
- 在web.xml文件中配置啟用URL Rewrite Filter,在web.xml文件中增加如下配置片段。
<!--定義Filter-->
<filter>
<!--Filter的名字,相當于指定@WebFilter的filtername屬性-->
<filter-name>UrlRewriteFilter</filter-name>
<!--Filter的實現類-->
<filter-class>org.tuckey.web.filters.urlrewrite.UrlRewriteFilter</filter-class>
</filter>
<!--定義Filter攔截URL地址-->
<filter-mapping>
<filter-name>UrlRewriteFilter</filter-name>
<!--Filter負責攔截的URL,相當于指定@WebFilter的urlPatterns屬性-->
<utl-pattern>/*<utl-pattern>
</filter-mapping>
- 在應用的WEB-INF路徑下增加urlrewrite.xml文件,該文件定義了偽靜態映射規則,這份偽靜態規則是基于正則表達式的。
urlrewrite.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE urlrewrite PUBLIC "-//tuckey.org//DTD UrlRewrite 3.2//EN"
"http://tuckey.org/res/dtds/urlrewrite3.2.dtd">
<urlrewrite>
<rule>
<!--所有配置如下正則表達式的請求-->
<from>/userinf-(\w*).html</form>
<!--將被forward到如下JSP頁面,其中$1代表上面一個正則表達式所匹配的字符串-->
<to type="forward"></userinf.jsp?username=$1</to>
</rule>
</urlrewrite>