二、Filter介紹

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>
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容