作者:
beauty9235
鏈接:
http://beauty9235.javaeye.com/blog/229651
發(fā)表時間: 2008年06月09日
聲明:本文系JavaEye網(wǎng)站發(fā)布的原創(chuàng)博客文章,未經(jīng)作者書面許可,嚴禁任何網(wǎng)站轉(zhuǎn)載本文,否則必將追究法律責任!
過濾器總結(jié)
一、Servlet過濾器的概念:
Servlet過濾器是在Java Servlet規(guī)范2.3中定義的,它能夠?qū)ervlet容器的請求和響應(yīng)對象進行檢查和修改。
Servlet過濾器本身并不產(chǎn)生請求和響應(yīng)對象,它只能提供過濾作用。Servlet過期能夠在Servlet被調(diào)用之前檢查Request對象,修改Request Header和Request內(nèi)容;在Servlet被調(diào)用之后檢查Response對象,修改Response Header和Response內(nèi)容。
Servlet過期負責過濾的Web組件可以是Servlet、JSP或者HTML文件。
二、Servlet過濾器的特點:
A.Servlet過濾器可以檢查和修改ServletRequest和ServletResponse對象
B.Servlet過濾器可以被指定和特定的URL關(guān)聯(lián),只有當客戶請求訪問該URL時,才會觸發(fā)過濾器
C.Servlet過濾器可以被串聯(lián)在一起,形成管道效應(yīng),協(xié)同修改請求和響應(yīng)對象
三、Servlet過濾器的作用:
A.查詢請求并作出相應(yīng)的行動。
B.阻塞請求-響應(yīng)對,使其不能進一步傳遞。
C.修改請求的頭部和數(shù)據(jù)。用戶可以提供自定義的請求。
D.修改響應(yīng)的頭部和數(shù)據(jù)。用戶可以通過提供定制的響應(yīng)版本實現(xiàn)。
E.與外部資源進行交互。
四、Servlet過濾器的適用場合:
A.認證過濾
B.登錄和審核過濾
C.圖像轉(zhuǎn)換過濾
D.數(shù)據(jù)壓縮過濾
E.加密過濾
F.令牌過濾
G.資源訪問觸發(fā)事件過濾
H.XSL/T過濾
I.Mime-type過濾
五、Servlet過濾器接口的構(gòu)成:
所有的Servlet過濾器類都必須實現(xiàn)javax.servlet.Filter接口。這個接口含有3個過濾器類必須實現(xiàn)的方法:
A.init(FilterConfig):
這是Servlet過濾器的初始化方法,Servlet容器創(chuàng)建Servlet過濾器實例后將調(diào)用這個方法。在這個方法中可以讀取web.xml文件中Servlet過濾器的初始化參數(shù)
B.doFilter(ServletRequest,ServletResponse,FilterChain):
這個方法完成實際的過濾操作,當客戶請求訪問于過濾器關(guān)聯(lián)的URL時,Servlet容器將先調(diào)用過濾器的doFilter方法。FilterChain參數(shù)用于訪問后續(xù)過濾器
B.destroy():
Servlet容器在銷毀過濾器實例前調(diào)用該方法,這個方法中可以釋放Servlet過濾器占用的資源
六、Servlet過濾器的創(chuàng)建步驟:
A.實現(xiàn)javax.servlet.Filter接口
B.實現(xiàn)init方法,讀取過濾器的初始化函數(shù)
C.實現(xiàn)doFilter方法,完成對請求或過濾的響應(yīng)
D.調(diào)用FilterChain接口對象的doFilter方法,向后續(xù)的過濾器傳遞請求或響應(yīng)
E.銷毀過濾器
七、Servlet過濾器對請求的過濾:
A.Servlet容器創(chuàng)建一個過濾器實例
B.過濾器實例調(diào)用init方法,讀取過濾器的初始化參數(shù)
C.過濾器實例調(diào)用doFilter方法,根據(jù)初始化參數(shù)的值判斷該請求是否合法
D.如果該請求不合法則阻塞該請求
E.如果該請求合法則調(diào)用chain.doFilter方法將該請求向后續(xù)傳遞
八、Servlet過濾器對響應(yīng)的過濾:
A.過濾器截獲客戶端的請求
B.重新封裝ServletResponse,在封裝后的ServletResponse中提供用戶自定義的輸出流
C.將請求向后續(xù)傳遞
D.Web組件產(chǎn)生響應(yīng)
E.從封裝后的ServletResponse中獲取用戶自定義的輸出流
F.將響應(yīng)內(nèi)容通過用戶自定義的輸出流寫入到緩沖流中
G.在緩沖流中修改響應(yīng)的內(nèi)容后清空緩沖流,輸出響應(yīng)內(nèi)容
九、Servlet過濾器的發(fā)布:
A.發(fā)布Servlet過濾器時,必須在web.xml文件中加入<filter>元素和<filter-mapping>元素。
B.<filter>元素用來定義一個過濾器:
屬性 含義
filter-name 指定過濾器的名字
filter-class 指定過濾器的類名
init-param 為過濾器實例提供初始化參數(shù),可以有多個
C.<filter-mapping>元素用于將過濾器和URL關(guān)聯(lián):
屬性 含義
filter-name 指定過濾器的名字
url-pattern 指定和過濾器關(guān)聯(lián)的URL,為"/"表示所有URL
十一、Servlet過濾器使用的注意事項
A.由于Filter、FilterConfig、FilterChain都是位于javax.servlet包下,并非HTTP包所特有的,所以其中所用到的請求、響應(yīng)對象ServletRequest、ServletResponse在使用前都必須先轉(zhuǎn)換成HttpServletRequest、HttpServletResponse再進行下一步操作。
B.在web.xml中配置Servlet和Servlet過濾器,應(yīng)該先聲明過濾器元素,再聲明Servlet元素
C.如果要在Servlet中觀察過濾器生成的日志,應(yīng)該確保在server.xml的localhost對應(yīng)的<host>元素中配置如下<logger>元素:
<Logger className = "org.apache.catalina.logger.FileLogger"
directory = "logs" prefix = "localhost_log."suffix=".txt"
timestamp = "true"/>
常用的過濾器實例:
//對整站編碼的過濾
public void doFilter(ServletRequest request, ServletResponse sresponse,FilterChain chain) {
try{
request.setCharacterEncoding("GBK");
chain.doFilter(request, sresponse);
}catch(Exception e){
e.printStackTrace();
}
}
//對用戶登陸進行驗證
public void doFilter(ServletRequest srequest, ServletResponse sresponse,FilterChain chain) {
try {
HttpServletRequest request = (HttpServletRequest) srequest;
HttpServletResponse response = (HttpServletResponse) sresponse;
HttpSession session = request.getSession();
User user = (User) session.getAttribute("user");
if (user == null) {
response.sendRedirect("/test/index.html");
} else {
chain.doFilter(request, response);
}
} catch (Exception e) {
e.printStackTrace();
}
}
//對用戶權(quán)限進行過濾
public void doFilter(ServletRequest srequest, ServletResponse sresponse,FilterChain chain) {
try {
HttpServletRequest requst = (HttpServletRequest) srequest;
HttpServletResponse response = (HttpServletResponse) sresponse;
HttpSession session = requst.getSession();
User user = (User) session.getAttribute("user");
String ad=user.getIsAdmin().toString();
if (user == null || ad.equals("0")) {
response.sendRedirect("/test/main.jsp");
} else {
chain.doFilter(srequest, sresponse);
}
} catch (Exception e) {
e.printStackTrace();
}
}
web.xml中的配置
encodingfilter
filter.EncodingFilter
firstfilter
filter.FirstFilter
secondfilter
filter.SecondFilter
encodingfilter
/*
firstfilter
/web/*
secondfilter
/web/Charge.jsp
本文的討論也很精彩,瀏覽討論>>
JavaEye推薦