Filter 可認為是 Servlet的一種 “ 加強版 ”,它主要用于對用戶請求進行預處理, 也可以對HttpServletResponse 進行后處理,是個典型的處理鏈。Filter 也可對用戶請求生成響應,這一 點與Servlet 相同, 但實際上很少會使用Filter向用戶請求生成晌應。 使用Filter完整的流程是:Filter對用戶請求進行預處理, 接著將請求交給Servlet 進行處理并生成響應, 最后Filter再對服務器響應進行后處理。
Filter有如下幾個用處。
》在HttpServletRequest到達Servlet之前, 攔截客戶的HttpServletRequest。
》根據需要檢查HttpServletRequest, 也可以修改HttpServletRequest頭和數據。
》在HttpServletResponse到達客戶端之前, 攔截HttpServletResponse。
》根據需要檢查HttpServletResponse, 也可以修改HttpServletResponse頭和數據。
Filter有如下幾個種類。
》用戶授權的Filter: Filter負責檢查用戶請求, 根據請求過濾用戶非法請求。
〉日志Filter: 詳細記錄某些特殊的用戶請求。
》負責解碼的Filter: 包括對非標準編碼的請求解碼。
〉能改變XML內容的XSLTFilter等。
》Filter可負責攔截多個請求或響應;一個請求或響應也可被多個Filter攔截。
創建Filter只需兩個步驟:
1、創建Filter處理類
2、web.xml中配置Filter
1、創建Filter處理類
創建 Filter 必須實現 javax.servlet.Filter 接口, 在該接口中定義了如下三個方法。
》 void init ( FilterConfig config ): 用于完成 Filter 的初始化。
》 void destroy(): 用于 Filter 銷毀前, 完成某些資源的回收。
》 void doFilter CServletRequest request, ServletResponse response,FilterChain chain ):實現過濾功能,
?
下面介紹一個日志 Filter, 這個 Filter 負責攔截所有的用戶請求, 并將請求的信息記錄在日志中:
package servlet;import java.io.IOException;import javax.servlet.Filter; import javax.servlet.FilterChain; import javax.servlet.FilterConfig; import javax.servlet.ServletException; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; import javax.servlet.annotation.WebFilter; import javax.servlet.http.HttpServletRequest;@WebFilter(filterName="log",urlPatterns="/*") public class LogFilter implements Filter{@Overridepublic void destroy() {System.out.println("執行filter的destroy方法");}@Overridepublic void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)throws IOException, ServletException {System.out.println("執行filter的doFilter方法");HttpServletRequest hrequest = (HttpServletRequest) request;System.out.println("用戶請求的地址為:"+hrequest.getServletPath());chain.doFilter(request, response);}@Overridepublic void init(FilterConfig config) throws ServletException {System.out.println("執行filter的init方法");}}
2、配置Filter
前面已經提到, Filter 可以認為是 Servlet 的 “ 增強版”,因此配置 Filter 與配置 Servlet 非常相似,都需要配置如下兩個部分。
》配置 Filter 名。
》配置 Filter 攔截 URL 模式。
區別在于: Serviet 通常只配置一個 URL,而Filter 可以同時攔截多個請求的 URL。因此, 在配置Filter 的 URL 模式時通常會使用模式字符串, 使得 Filter 可以攔截多個請求。 與配置 Serviet 相似的是, 配置 Filter 同樣有兩種方式。
》在 Filter 類中通過注解進行配置。
》在 web.xml 文件中通過配置文件進行配置。
上面 Filter 類的粗體字代碼使用@Webfilter 配置該 Filter 的名字為 log,它會攔截向/*發送的所有的請求。
@Webfilter 修飾一個 Filter 類, 用于對 Filter 進行配置, 它支持如下圖所示的常用屬性
在 web.xml 文件中配置 Filter 與配置 Serviet 非常相似,需要為 Filter 指定它所過濾的 URL,并且也 可以為 Filter 配置參數。
<filter><filter-name>log</filter-name><filter-class>servlet.LogFilter</filter-class></filter><filter-mapping><filter-name>log</filter-name><url-pattern>/*</url-pattern></filter-mapping>
Filter的作用:
?
3、使用URL Rewrite實現網站偽靜態
?
xxx.jsp?param=value ...
大部分搜索引擎都會優先考慮收錄靜態的HTML頁面,而不是這種動態的*.jsp、*.php頁面。但實
際上絕大部分網站都是動態的,不可能全部是靜態的HTML頁面,因此互聯網上的大部分網站都會與
慮使用偽靜態一一就是將飛jsp、*.php 這種動態U虹偽裝成靜態的HTML頁面。
對于JavaWeb應用來說,要實現偽靜態非常簡單:可以通過Filter攔截所有發向*.html請求,然1;;
按某種規則將請求forward到實際的*.jsp頁面即可。現有的URL Rewrite開源項目為這種思路提供了實
現,使用URL Rewrite實現網站偽靜態也很簡單。
下面詳細介紹如何利用URL Rewrite實現網站偽靜態。
登錄http://www.tuckey.org/urlrewrite/站點下載Uri Rewrite 的最新版本,本書成書時,該項目的
最新版本是4.0.3,建議讀者也下載該版本的Uri Rewrite。
下載URL Rewrite,直接下載它的urlrewritefilter-4.0.3.jar即可,并將該JAR包復制到Web應用
的WEB-INF\lib目錄下。
在web.xml文件中配置啟用URL Rewrite Filter,在web.xml文件中增加如下配置片段。
<filter><filter-name>UrlRewriteFilter</filter-name><filter-class>org.tuckey.web.filters.urlrewrite.UrlRewriteFilter</filter-class></filter><filter-mapping><filter-name>UrlRewriteFilter</filter-name><url-pattern>/*</url-pattern></filter-mapping>
上面的配置片段指定使用URL Rewrite Filter攔截所有的用戶請求。
在應用的WEB-INF 路徑下增加urlrewrite.xml文忡,該文件定義了偽靜態l映射規則,這份偽靜態規則是基于正則表達式的。
下面是本應用所使用的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</from><to type="forward">/userinf.jsp?username=$1</to></rule></urlrewrite>
上面的規則文件中只定義了一個簡單的規則:所有發向/userinf-(\w*).html的請求都將被forward 到
userinfjsp 頁面, 并將(\w*)正則表達式所匹配的內容作為usemame 參數值。根據這個偽靜態規則, 需要為
該應用提供一個userinf.jsp 頁面,
?