和Servlet類似,Filter也是一個實現特殊接口的普通java類,只不過實現了Filter接口,需要實現該接口的一些過濾方法,實現了對一些請求信息的攔截。首先,我們確定一下它攔截的對象:在瀏覽器調用Servlet之前,在服務器返回非瀏覽器之前就行過濾它可以攔截jsp,Servlet,靜態圖片和靜態HTML文件。相當於服務器的門衛,對客戶端發來的請求和對客戶端做出的響應進行過濾。
那麼對於這麼一個類,如何讓他工作?
首先,這個類需要實現Filter接口,將該接口的方法實現,然後在web.xml中註冊和映射攔截的路徑就行了。這樣一說跟Servlet的工作方式基本上一致,只不過Servlet配置的是可以訪問的路徑,這裏是攔截的路徑。其實實現接口的方法都很類似,都是一個init方法,這個方法附帶一個配置參數,利用這個配置參數可以獲取配置的各種信息,甚至包括ServletContext的配置信息;還有一個destroy方法,不用管;還有就是一個主要的每次用到的方法,只不過名字一個是service方法一個是doFilter方法,反正都是每次都用它工作就對了。
這裏我們說一下它的配置(當然在Servlet3.0規範中可以使用註解,不用配置,但是學習時還是自己動手配一下加深學習比較好)。
<filter>
<filter-name>filterTest1</filter-name>
<filter-class>Filter.FilterTest1</filter-class>
</filter>
<filter-mapping>
<filter-name>filterTest1</filter-name>
<url-pattern>/filter/test1.jsp</url-pattern>
<dispatcher>REQUEST</dispatcher>
<dispatcher>FORWARD</dispatcher>
</filter-mapping>
可以看到這裏的配置方式跟Servlet基本一致,後面dispatcher是設置攔截方式,一般默認是REQUEST,表示對請求進行攔截,當然這個也是用的最多的,其次是Forward方式,表示對轉發進行攔截。
Filter是相互鏈式的工作的,就是說一個Filter放行後會自動轉給另一個Filter來處理的,這裏他們工作的順序是根據web.xml中<filter-mapping>的順序來決定的。
對於Filter,其經典的應用是處理用戶登錄問題,很多頁面,用戶沒有登錄則不給於顯示。其原理就是在Filter中判斷用戶的session狀態,如果登陸了就放行。利用Filter還可以解決亂碼問題,設置頁面請求的編碼,設置頁面是否緩存等:這裏給兩個簡單的代碼:
//使瀏覽器不緩存
response.setDateHeader("Expires",-1);
response.setHeader("Cache-Control","no-cache");
response.setHeader("Pragma","no-cache");
可以在web.xml中設置編碼方式,在Filter中進行設置:
//解決亂碼:
HttpServletRequest req=(HttpServletRequest) request;
HttpServletResponse res=(HttpServletResponse) response;
String encoding= fConfig.getServletContext().getInitParameter("encoding");//通過配置參數獲取web.xml中設置的編碼方式
req.setCharacterEncoding(encoding);//設置編碼方式
chain.doFilter(request, response);
OK,Filter就複習這麼多吧