日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

认识Filter

發(fā)布時間:2025/3/20 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 认识Filter 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

1.定義

Filter的翻譯就是過濾器,可以認(rèn)為它是一種加強(qiáng)版的Servlet。

幾種常見Filter:
1. 用戶授權(quán)Filter。用于檢查用戶請求,根據(jù)請求過濾用戶非法請求。
2. 日志Filter。用于記錄某些特殊的用戶請求。
3. 解碼Filter
4. 改變XML內(nèi)容的XSLT Filter

2. Filter作用

  • 對用戶請求進(jìn)行預(yù)處理:在HttpServletRequest到達(dá)Servlet之前進(jìn)行攔截和修改。
  • 對HttpServletResponse進(jìn)行后處理:在HttpServletResponse到達(dá)客戶端之前進(jìn)行攔截和修改。
  • 對用戶請求生成響應(yīng)(很少這么用)
  • 3.創(chuàng)建 Filter

    1. 創(chuàng)建Filter處理類

    package com.zrgk.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.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; //通過注解方式配置,不需要在web.xml中再配置 @WebFilter(filterName="log",urlPatterns={"/*"}) public class MyFilter implements Filter {@Overridepublic void destroy() {//在Filter銷毀前,對某些資源進(jìn)行回收 }//過濾所有請求:對每個請求和響應(yīng)進(jìn)行額外處理@Overridepublic void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws IOException, ServletException {//轉(zhuǎn)換成HttpServletRequest請求,可多一些處理方法HttpServletRequest request = (HttpServletRequest)req; HttpServletResponse response = (HttpServletResponse)resp;//設(shè)置所有路徑都支持跨域請求response.setHeader("Access-Control-Allow-Origin", "*");//打印記錄訪問路徑System.out.println("訪問路徑是:"+request.getServletPath());//放行。Filter是鏈?zhǔn)教幚?#xff0c;只有放行后,才能繼續(xù)往后執(zhí)行//執(zhí)行該方法前,是對用戶請求進(jìn)行預(yù)處理//執(zhí)行該方法后,是對服務(wù)器響應(yīng)進(jìn)行后處理//說明chain.doFilter(...);后面的代碼要在服務(wù)器生成響應(yīng)后才能執(zhí)行chain.doFilter(req, resp);System.out.println("放行后,還可執(zhí)行后面的代碼");}@Overridepublic void init(FilterConfig arg0) throws ServletException {//用于完成對Filter的初始化 }}

    注:要攔截多個URL時,使用模式字符串來攔截。

    2. web.xml文件中配置Filter

    若不是采用的注解方式創(chuàng)建Filter就得在web.xml當(dāng)中配置如下代碼:

    <!-- 定義Filter --><filter><!-- Filter名字,相當(dāng)于@WebFilter的filterName屬性 --><filter-name>log</filter-name><!-- Filter實現(xiàn)類 --><filter-class>com.zrgk.servlet.MyFilter</filter-class></filter><!-- 定義Filter攔截的URL --><filter-mapping><!-- Filter名字 --><filter-name>log</filter-name><!-- 要攔截的URL,相當(dāng)于指定@WebFilter的urlPatterns屬性 --><url-pattern>/*</url-pattern></filter-mapping>

    4.Filter注解(@WebFilter)的常用屬性

    屬性說明
    asyncSupported指定該Filter是否支持異步操作
    dipatcherTypes指定該Filter僅對哪種dispatcher模式的請求進(jìn)行過濾。該屬性支持ASYNC、ERROR、FORWORD、INCLUDE、REQUEST這5個值的任意組合,默認(rèn)同時過濾這5種。
    displayName指定該Filter的顯示名字
    filterName指定該Filter的名稱
    initParams為該Filter配置參數(shù)
    servletNames指定該Filter對哪些Servlet執(zhí)行過濾,可多個值。
    urlPatterns/value指定要攔截的URL。這兩個屬性作用是一樣的。

    5.Filter與Servlet比較

  • 實際上,Filter只是在doFilter()方法里比Servlet多了個FilterChain類型的參數(shù),該參數(shù)控制是否放行用戶請求。
  • 獲取Filter初始化參數(shù)使用FilterConfig的getInitParameter()方法
  • Filter和Servlet具有完全相同的生命周期
  • Filter也可通過<init-param.../>或@WebFilter的initParams來配置初始化參數(shù)。代碼片:
  • @WebFilter(filterName="log",urlPatterns={"/*"},initParams={@WebInitParam(name="encoding",value="GBK"),@WebInitParam(name="loginPage",value="/login.jsp")} ) public class MyFilter implements Filter {//略....... }

    6. 使用URL Rewrite實現(xiàn)網(wǎng)站靜態(tài)

  • 大部分搜索引擎優(yōu)先考慮收錄靜態(tài)HTML頁面,而不是這種動態(tài)的*.jsp、*.php頁面
  • 實現(xiàn)網(wǎng)站偽靜態(tài)思路:通過Filter攔截所有發(fā)向*html的請求,然后將請求按某種規(guī)則forword(轉(zhuǎn)發(fā))到實際的*.jsp頁面。
  • 需要下載urlrewriterfilter-4.0.3.jar包
  • web.xml中配置:
  • <filter><filter-name>UrlReWriterFilter</filter-name><filter-class>org.tuckey.web.filters.urlrewrite.UrlRewriterFilter</filter-class></filter><filter-mapping><filter-name>UrlReWriterFilter</filter-name><!-- 攔截所有的URL --><url-pattern>/*</url-pattern></filter-mapping>
  • 在WEB-INF路徑下添加一個urlrewrite.xml文件來定義偽靜態(tài)映射規(guī)則:
  • <urlrewrite><rule><!-- 所有配置如下正則表達(dá)式的請求 --><form>/userinf-(\w*).html</form><!-- 轉(zhuǎn)發(fā)到如下頁面,$1代表上面第一個正則里所匹配的字符串 --><to type="forword">/userinf.jsp?username=$1</to></rule> </urlrewrite>

    所以請求userinf-XXX.html頁面都會轉(zhuǎn)發(fā)到userinf.jsp頁面。

    《新程序員》:云原生和全面數(shù)字化實踐50位技術(shù)專家共同創(chuàng)作,文字、視頻、音頻交互閱讀

    總結(jié)

    以上是生活随笔為你收集整理的认识Filter的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。