本篇文章只是一篇學習筆記,其中參考了許多文章。
一:簡介
filter(過濾器)是servlet2.3中增加的一個新功能,filter可以改變一個請求(request)或者是修改響應(response)。filter不是一個servlet,它只是一個servlet接受到請求前的預處理器。就是說,用戶發送一個請求給servlet時,在servlet處理之前,這個filter首先執行,然后才是servlet的執行。
二:作用
filter可以用在下面幾個方面
1:訪問特定資源(Web 頁、JSP 頁、servlet)時的身份認證
2:訪問資源的記錄
3:訪問資源的轉換
三:編寫filter
一個filter 必須實現javax.servlet.Filter 接口,即實現下面的三個方法:
1:void init(FilterConfig config) throws ServletException: 初始化方法
2:void destroy():
3:void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException: 完成具體的過濾工作。
四:示例
示例一:限制訪問資源
我們以參考文獻1中的第一個例子介紹怎樣限制用戶訪問特定的資源
在那個例子中,對瀏覽器為IE的用戶做了限制,原文講的很清楚,關鍵代碼如下:
CODE
?1
import?java.io.*;
?2
import?javax.servlet.*;
?3
import?javax.servlet.http.*;
?4
?5
public?final?class?IEFilter?implements?Filter?
{
?6
?7
????private?FilterConfig?filterConfig?=?null;
?8
?9
????public?void?doFilter(ServletRequest?request,?ServletResponse?response,
10
?????????????????????????FilterChain?chain)
11
????throws?IOException,?ServletException?
{
12
??????String?browserDet?=?((HttpServletRequest)?request).getHeader("User-Agent").toLowerCase();
13
14
??????if?(?browserDet.indexOf("msie")?!=?-1)??
{
15
????????????PrintWriter?out?=?response.getWriter();
16
????????????out.println("<html><head></head><body>");
17
????????????out.println("<h1>Sorry,?page?cannot?be?displayed!</h1>");
18
????????????out.println("</body></html>");
19
????????????out.flush();
20
????????????return;
21
??????????}
22
23
??????chain.doFilter(request,?response);
24
25
????}
26
27
????public?void?destroy()?
{
28
????}
29
30
????public?void?init(FilterConfig?filterConfig)?
{
31
????this.filterConfig?=?filterConfig;
32
????}

?2

?3

?4

?5



?6

?7

?8

?9

10

11



12

13

14



15

16

17

18

19

20

21

22

23

24

25

26

27



28

29

30



31

32

看看doFilter的參數可知,利用request和response我們可以對做各種處理。例如可以通過ServletRequest類的getRemoteAddr()方法得到訪問這個應用的客戶端ip,然后對這個ip作一些處理,如果不符合條件,可以限制訪問。這樣可以很好的保護應用。
示例二:資源轉換
參考文獻一中的第二個例子演示了怎樣將用戶要訪問的資源進行轉換。
示例三:訪問記錄
類似于一個跟蹤程序,參考文獻二中的第二個例子演示了怎樣記錄用戶訪問的所有屬于同一個應用的資源。
五:配置
以tomcat為例:每個使用filter的應用的web.xml類似下面
CODE
?1
<web-app>?
?2
????<filter>
?3
????????<filter-name>Filter</filter-name>?//這里是Filter的名字,隨便你怎么起
?4
????????<filter-class>FilterClass</filter-class>?//Filter的類名,注意包含package
?5
????</filter>
?6
?7
????<filter-mapping>
?8
????????<filter-name>Filter</filter-name>//與上面的保持一致
?9
????????<url-pattern>/*</url-pattern>?//對所有資源應用此filter
10
????</filter-mapping>
11
</web-app>

?2

?3

?4

?5

?6

?7

?8

?9

10

11

如果一個應用有多個Filter,則在web.xml文件中,<filter-mapping>靠前的filter先執行。
六:測試
可以把參考文獻一和二中的代碼中的war文件放到tomcat\webapp目錄下,啟動tomcat,用類似http://localhost:8080/clickstream(此乃文獻二中第二個例子的訪問方法)訪問。
這只是一篇筆記,要想真正理解filter,建議讀下面兩篇文章。
參考文獻
1:Tomcat 的過濾訣竅
2:Filter code with Servlet 2.3 model