過(guò)濾器
簡(jiǎn)介
對(duì)Web應(yīng)用來(lái)說(shuō),過(guò)濾器是一個(gè)駐留在服務(wù)器端的Web組件瑞你,它可以截取客戶(hù)端和服務(wù)器之間的請(qǐng)求與響應(yīng)信息,并對(duì)這些信息進(jìn)行過(guò)濾。
當(dāng)Web容器接受到一個(gè)對(duì)資源的請(qǐng)求時(shí)昂勉,它將判斷是否有過(guò)濾器與這個(gè)資源相關(guān)聯(lián)。如果有扫腺,那么容器將把請(qǐng)求交給過(guò)濾器進(jìn)行處理岗照。
在過(guò)濾器中,你可以改變請(qǐng)求的內(nèi)容笆环,或者重新設(shè)置請(qǐng)求的報(bào)頭信息攒至,然后再將請(qǐng)求發(fā)送給目標(biāo)資源。當(dāng)目標(biāo)資源對(duì)請(qǐng)求作出響應(yīng)時(shí)候躁劣,容器同樣會(huì)將響應(yīng)先轉(zhuǎn)發(fā)給過(guò)濾器迫吐,在過(guò)濾器中你可以對(duì)響應(yīng)的內(nèi)容進(jìn)行轉(zhuǎn)換,然后再將響應(yīng)發(fā)送到客戶(hù)端账忘。
常見(jiàn)的過(guò)濾器用途主要包括
對(duì)用戶(hù)請(qǐng)求進(jìn)行統(tǒng)一認(rèn)證志膀、對(duì)用戶(hù)的訪問(wèn)請(qǐng)求進(jìn)行記錄和審核、對(duì)用戶(hù)發(fā)送的數(shù)據(jù)進(jìn)行過(guò)濾或替換鳖擒、轉(zhuǎn)換圖象格式溉浙、對(duì)響應(yīng)內(nèi)容進(jìn)行壓縮以減少傳輸量、對(duì)請(qǐng)求或響應(yīng)進(jìn)行加解密處理蒋荚、觸發(fā)資源訪問(wèn)事件戳稽、對(duì)XML的輸出應(yīng)用XSLT等。
和過(guò)濾器相關(guān)的接口主要有
Filter期升、FilterConfig和FilterChain惊奇。
部署過(guò)濾器的方法
1.注解
@WebServlet(urlPatterns="/edit_emp.do", loadOnStartup=1)
壞處:無(wú)法確定過(guò)濾器的執(zhí)行順序
2.配置web.xml
<filter>
<filter-name>encodingFilter</filter-name>
<filter-class>com.kygo.filters.CharacterEncodingFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>encodingFilter</filter-name>
<url-pattern>*.do</url-pattern>
</filter-mapping>
好處:可以確定過(guò)濾器的執(zhí)行順序互躬,先寫(xiě)先執(zhí)行
例子1:改變編碼
// @WebFilter(urlPatterns={"*.do"})
public class CharacterEncodingFilter implements Filter {
public CharacterEncodingFilter() {
}
public void destroy() {
}
public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws IOException, ServletException {
// 在請(qǐng)求小服務(wù)之前要做的處理
req.setCharacterEncoding("utf-8");
resp.setCharacterEncoding("utf-8");
// 過(guò)濾器鏈條 繼續(xù)下一個(gè)過(guò)濾器
chain.doFilter(req, resp);
// 在請(qǐng)求小服務(wù)之后要做的處理
}
public void init(FilterConfig fConfig) throws ServletException {
}
}
例子2:不讓其他網(wǎng)站使用自己服務(wù)器上的圖片資源
@WebFilter(urlPatterns={"*.jpg", "*.png", "*.gif"})
public class ImageProtectionFilter implements Filter {
@Override
public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain)
throws IOException, ServletException {
HttpServletRequest request = (HttpServletRequest) req;
String referer = request.getHeader("Referer");
if (referer != null) {
chain.doFilter(req, resp);
}
else {
HttpServletResponse response = (HttpServletResponse) resp;
response.sendError(404);
}
}
}