Filter的主要作用于對(duì)用戶進(jìn)行預(yù)處理到忽,也可以對(duì)HttpServletResponse進(jìn)行后處理蜜托,是個(gè)典型的吃力鏈抄囚。使用Filter的完整流程:Fileter對(duì)用戶請(qǐng)求進(jìn)行預(yù)處理,接著把請(qǐng)求交個(gè)Servlet進(jìn)行處理并生成響應(yīng)橄务,最后Filter再對(duì)服務(wù)器響應(yīng)進(jìn)行后處理幔托。
Filter的用處:
- 在HttpServletRequest到達(dá)Servlet之前,來(lái)接客戶的HttpServletRequest蜂挪。
- 根據(jù)需要檢查HttpServletRequest重挑,也可以修改HttpServletRequest頭和數(shù)據(jù)。
- 在HttpServletResponse到達(dá)客服端之前棠涮,攔截HttpServletResponse谬哀。
- 根據(jù)需要檢查HttpServletResponse,也可以修改HttpServletResponse頭和數(shù)據(jù)严肪。
Filter的種類:
- 用戶授權(quán)的Filter:Filter負(fù)責(zé)檢查用戶請(qǐng)求史煎,根據(jù)請(qǐng)求過(guò)濾用戶非法請(qǐng)求。
- 日志Filter:詳細(xì)記錄某些特殊的用戶請(qǐng)求驳糯。
- 負(fù)責(zé)解碼的Filter:包括對(duì)非標(biāo)準(zhǔn)編碼的請(qǐng)求解碼篇梭。
- 能改變XML內(nèi)容的XSLT Filter等。
- Filter可負(fù)責(zé)攔截多個(gè)請(qǐng)求或響應(yīng)酝枢,一個(gè)請(qǐng)求或響應(yīng)也可被多個(gè)Filter攔截恬偷。
創(chuàng)建Filter的兩步:
- 創(chuàng)建Filter處理類。
- web.xml文件中配置Filter帘睦。
2.1創(chuàng)建Filter類
創(chuàng)建Filter必須實(shí)現(xiàn)javax.servlet.Filter接口袍患,該接口中定義了三個(gè)方法:
- void init(FilterConfig config):用于完成Filter的初始化坦康。
- void destroy():用于Filter銷毀前,完成某些資源的回收诡延。
- void doFilter(ServletRequest request,ServletResponse response,FilterChain chain):實(shí)現(xiàn)過(guò)濾功能滞欠,該方法就是對(duì)每個(gè)請(qǐng)求及相應(yīng)增加的額外處理。
2.2配置Filter
- 配置Filter名肆良。
- 配置Filter攔截URL模式仑撞。
Servlet和Filter的區(qū)別:Servlet通常只配置一個(gè)URL,而Filter可以同時(shí)攔截多個(gè)請(qǐng)求的URL妖滔。因此在配置Filter的URL模式時(shí)通常會(huì)使用模式字符串,使得Filter可以攔截多個(gè)請(qǐng)求桶良。
配置Filter的兩種方式:
- 在Filter類中通過(guò)注解來(lái)配置座舍。
- 在web.xml中通過(guò)配置文件進(jìn)行配置。
web.xml
<!--定義Filter-->
<filter>
<!--Filter的名字陨帆,相當(dāng)于指定@WebFilter的filtername屬性-->
<filter-name>log</filter-name>
<!--Filter的實(shí)現(xiàn)類-->
<filter-class>lee.LogFilter</filter-class>
</filter>
<!--定義Filter攔截URL地址-->
<filter-mapping>
<filter-name>log</filter-name>
<!--Filter負(fù)責(zé)攔截的URL曲秉,相當(dāng)于指定@WebFilter的urlPatterns屬性-->
<utl-pattern>/*<utl-pattern>
</filter-mapping>
web.xml中為Filter配置參數(shù):
<!--定義Filter-->
<filter>
<!--Filter的名字,相當(dāng)于指定@WebFilter的filtername屬性-->
<filter-name>log</filter-name>
<!--Filter的實(shí)現(xiàn)類-->
<filter-class>lee.LogFilter</filter-class>
<!--為Filter配置參數(shù)-->
<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負(fù)責(zé)攔截的URL疲牵,相當(dāng)于指定@WebFilter的urlPatterns屬性-->
<utl-pattern>/*<utl-pattern>
</filter-mapping>
2.3使用URL Rewrite實(shí)現(xiàn)網(wǎng)站偽靜態(tài)
對(duì)于Java Web應(yīng)用來(lái)說(shuō)承二,要實(shí)現(xiàn)偽靜態(tài):可以通過(guò)Filter攔截所有發(fā)向.html請(qǐng)求,然后按照某種規(guī)則將請(qǐng)求forward到實(shí)際的.jsp頁(yè)面纲爸。**
URL Rewrite實(shí)現(xiàn)網(wǎng)站偽靜態(tài):
- 登錄http://code.google.com/p/urlrewritefilter/downloads/list 站點(diǎn)下載Url Rewrite亥鸠。
- 下載URL Rewrite。直接下載他的urlrewritefilter-4.0.3.jar即可识啦,并將該jar報(bào)復(fù)制到Web應(yīng)用的WEB-INF\lib目錄下负蚊。
- 在web.xml文件中配置啟用URL Rewrite Filter,在web.xml文件中增加如下配置片段颓哮。
<!--定義Filter-->
<filter>
<!--Filter的名字家妆,相當(dāng)于指定@WebFilter的filtername屬性-->
<filter-name>UrlRewriteFilter</filter-name>
<!--Filter的實(shí)現(xiàn)類-->
<filter-class>org.tuckey.web.filters.urlrewrite.UrlRewriteFilter</filter-class>
</filter>
<!--定義Filter攔截URL地址-->
<filter-mapping>
<filter-name>UrlRewriteFilter</filter-name>
<!--Filter負(fù)責(zé)攔截的URL,相當(dāng)于指定@WebFilter的urlPatterns屬性-->
<utl-pattern>/*<utl-pattern>
</filter-mapping>
- 在應(yīng)用的WEB-INF路徑下增加urlrewrite.xml文件冕茅,該文件定義了偽靜態(tài)映射規(guī)則伤极,這份偽靜態(tài)規(guī)則是基于正則表達(dá)式的。
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>
<!--所有配置如下正則表達(dá)式的請(qǐng)求-->
<from>/userinf-(\w*).html</form>
<!--將被forward到如下JSP頁(yè)面姨伤,其中$1代表上面一個(gè)正則表達(dá)式所匹配的字符串-->
<to type="forward"></userinf.jsp?username=$1</to>
</rule>
</urlrewrite>