老司机三级_天天干天天操天天爽_女人被爽到娇喘呻吟视频_久久国产精品99久久久大便 - 亚洲日本系列

javaweb(2.4)過濾器——Filter

  • • 發表于 8年前
  • • 作者 大妖怪
  • • 3874 人瀏覽
  • • 5 條評論
  • • 最后編輯時間 8年前
  • • 來自 [技 術]

原創聲明:本文為作者原創,未經允許不得轉載,經授權轉載需注明作者和出處

前面我們介紹過設置Servlet請求和響應的字符編碼。當時的做法是這樣:

直接在當前Servlet接口上HttpServletRequest或者HttpServletResponse的編碼。照這么看,那么我們有多少個Servlet就得設置多少個類似的編碼。項目中只有一個兩個Servlet那還好說,如果項目中有幾百個呢?當然,神奇的Servlet也想到了這個問題,于是它為我們提供了過濾器(Filter)這樣的解決方案。
Servlet的過濾器體現了面向切面(AOP)的編程思想。那么什么是面向切面呢?我們可以把客戶端和服務端之間數據傳輸過程比作是水管流水,這個傳輸的連接就是水管,HttpServletRequest和HttpServletResponse就是水管里的水,往外或者往內流,那么,我們的Filter就可以看做是把水管橫著切開,然后插入一個個大小不同網來攔截水中不同的東西。

簡單畫了一下我們客戶端和服務端數據交流的示意圖。如圖所示:

  • 我們的過濾器可以加任意多個
  • 過濾器主要是加在請求到達服務器之前,對請求數據進行處理
  • 過濾器本身不會影響到我們的業務邏輯,也不會插入到我們的代碼當中,并且可以隨需求增加減少或者修改,增加了代碼的可服用小降低了項目的耦合度。
    下面我們在之前的基礎上來寫一個字符編碼的過濾器:
    首先我們在Servlet包的平級位置上建一個Filter包,用來放Filter:

    為了方便查看,點這個小箭頭

    選擇Package Presentation——Hierarchical將包路徑變得j簡潔點:

    然后,我們在Filter下建一個類,實現javax.servlet.Filter類,然后重寫類里面的三個方法:
public class EncodingFilter implements Filter {
    @Override
    public void destroy() {
        // TODO Auto-generated method stub

    }
    @Override
    public void doFilter(ServletRequest arg0, ServletResponse arg1, FilterChain arg2)
            throws IOException, ServletException {
        // TODO Auto-generated method stub
    }
    @Override
    public void init(FilterConfig arg0) throws ServletException {
        // TODO Auto-generated method stub
    }
}

和Servlet一樣,Fliter也有自己的生命周期:

  • init():初始化Filter,啟動時訪問該方法
  • doFilter():執行Filter內的業務邏輯,每一次請求都會訪問改方法
  • destroy():銷毀Filter,該方法在web容器關閉之后調用,用于清理內存資源

那么,別的不多講,有興趣的可以像試驗Servlet在每個方法內打印一下,我們現在往doFilter()內寫入處理字符編碼的業務邏輯:

@Override
public void doFilter(ServletRequest arg0, ServletResponse arg1, FilterChain arg2)
throws IOException, ServletException {
    arg0.setCharacterEncoding("UTF-8");//設置請求編碼

    arg1.setCharacterEncoding("UTF-8");//設置響應編碼

    arg2.doFilter(arg0,arg1);//處理過的請求傳回原來的連接
}

其中FilterChain這個類主要是為了實現將處理過請求傳回原來的連接,相當于給請求放行。因此我們可以利用這個移動端驗證登陸的過濾器,邏輯是用戶登陸之后服務器返回一個登陸的key并保存在緩存或者數據庫,移動端每次請求別的接口都需要在參數中駕駛證這個key,然后過濾器來驗證這個key在服務端是否存在,如果不存在,就不通過。

Filter寫好了,我們怎么用在Servlet上呢?配置web.xml,和Servlet的配置很像:

<filter>
    <filter-name>encodingFilter</filter-name>
    <filter-class>com.dyg.Filter.EncodingFilter</filter-class>
</filter>
<filter-mapping>
    <filter-name>encodingFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

寫完之后如圖:

這段配置和Servlet的配置很像,只不過url-pattern是配置過濾的路徑,這里”/“表示過濾所有的請求,按照圖中配置,如果將”/“改為”/test”則是過濾上,上面testServlet這個請求,該配置比較靈活,有可以做很多事情比如:

  • /*: 過濾所有
  • /*.jsp: 過濾某一類(如后綴是jsp)
  • /a/*: 過濾某目錄下所有內容(如a下的所有內容)
  • /a.jsp: 精確過濾某一個文件(如a.jsp)
分享到:
5條評論
Ctrl+Enter
作者

大妖怪

大妖怪

APP:1 帖子:76 回復:200 積分:7517

已加入社區[3226]天

夢里巷口,可有你倚門回首

作者詳情》
Top