十年網(wǎng)站開發(fā)經(jīng)驗(yàn) + 多家企業(yè)客戶 + 靠譜的建站團(tuán)隊(duì)
量身定制 + 運(yùn)營維護(hù)+專業(yè)推廣+無憂售后,網(wǎng)站問題一站解決
這期內(nèi)容當(dāng)中小編將會給大家?guī)碛嘘P(guān)在JavaWeb項(xiàng)目中如何正確的使用Filter過濾器,文章內(nèi)容豐富且以專業(yè)的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。
成都創(chuàng)新互聯(lián)是一家專注于網(wǎng)站制作、成都網(wǎng)站建設(shè)與策劃設(shè)計(jì),潁泉網(wǎng)站建設(shè)哪家好?成都創(chuàng)新互聯(lián)做網(wǎng)站,專注于網(wǎng)站建設(shè)十多年,網(wǎng)設(shè)計(jì)領(lǐng)域的專業(yè)建站公司;建站業(yè)務(wù)涵蓋:潁泉等地區(qū)。潁泉做網(wǎng)站價(jià)格咨詢:18980820575
一、由來
客戶端發(fā)起請求,那服務(wù)器不能什么請求都做出響應(yīng),做攔截處理,不僅能減輕服務(wù)器的壓力,還能保護(hù)數(shù)據(jù)的安全,同樣服務(wù)端做出響應(yīng)給客戶端時(shí)有時(shí)也需要進(jìn)行過濾,比如我們常見的圖片添加水印。為了處理這些問題,于是過濾器出現(xiàn)了。有時(shí)不僅僅對請求與響應(yīng)進(jìn)行一層的過濾,可能會過濾多層,所以提出了濾鏡鏈(FilterChain)的概念.
二、使用
在使用它之前先熟悉下它的作用的地方。過濾器作用在請求Request到達(dá)Servlet之前以及響應(yīng)Response到達(dá)瀏覽器之前會依次經(jīng)過過慮鏈。有些類似asp.net中的httpmodule.使用Filter主要是實(shí)現(xiàn)javax.servlet.filter接口。查看API可看到有3個(gè)方法。
1.public void init(FilterConfig filterConfig) throws ServletException
由 Web 容器調(diào)用,指示將放入服務(wù)中的過濾器。servlet 容器只在實(shí)例化過濾器之后調(diào)用一次 init 方法。在要求過濾器做任何過濾工作之前,init 方法必須成功完成。如果 init 方法拋出 ServletException或沒有在 Web 容器定義的時(shí)間段內(nèi)返回,則 Web 容器無法將過濾器放入服務(wù)中。這個(gè)和Servlet的生命周期有點(diǎn)類似,也是只初始化一次,destroy()也是執(zhí)行一次。
2.public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws java.io.IOException, ServletException
每次由于對鏈末尾的某個(gè)資源的客戶端請求而通過鏈傳遞請求/響應(yīng)對時(shí),容器都會調(diào)用 Filter 的 doFilter 方法。傳入此方法的 FilterChain 允許 Filter 將請求和響應(yīng)傳遞到鏈中的下一個(gè)實(shí)體。
此方法的典型實(shí)現(xiàn)遵循以下模式:
1. 檢查請求
2. 有選擇地將帶有自定義實(shí)現(xiàn)的請求對象包裝到用于輸入過濾的過濾器內(nèi)容或頭中
3. 有選擇地將帶有自定義實(shí)現(xiàn)的響應(yīng)對象包裝到用于輸出過濾的過濾器內(nèi)容或頭中
4. a) 既可以使用 FilterChain 對象 (chain.doFilter()) 調(diào)用鏈中的下一個(gè)實(shí)體,
4. b) 也可以不將請求/響應(yīng)對傳遞給過濾器鏈中的下一個(gè)實(shí)體,從而阻塞請求處理
5. 在調(diào)用過濾器鏈中的下一個(gè)實(shí)體之后直接設(shè)置響應(yīng)上的頭。
3.public void destroy()
由 Web 容器調(diào)用,指示將從服務(wù)中取出的過濾器。此方法僅在過濾器的 doFilter 方法中的所有線程都已退出之后調(diào)用一次,或者在過了超時(shí)期之后調(diào)用。在調(diào)用此方法之后,Web 容器不會再對此過濾器實(shí)例調(diào)用 doFilter 方法。此方法為過濾器提供了一個(gè)清除持有的所有資源(比如內(nèi)存、文件句柄和線程)的機(jī)會,并確保任何持久狀態(tài)都與內(nèi)存中該過濾器的當(dāng)前狀態(tài)保持同步。
三、案例
使用過濾器的地方有很多,這里就不一一舉例,下面的demo在上篇博客中HelloWorld項(xiàng)目的基礎(chǔ)上實(shí)現(xiàn)防盜鏈的功能,以此體會Filter的使用。
1.準(zhǔn)備
在HelloWolrd項(xiàng)目中新增一個(gè)文件夾,在文件夾中放入兩個(gè)圖片一個(gè)err.png 一個(gè)test.png,兩個(gè)圖如下
2.創(chuàng)建Filter
這里也沒新建Filter包,直接在上一博客中的com.test.cyw包中創(chuàng)建Filter文件MyFilter,應(yīng)該是創(chuàng)建一個(gè)包專門管理Filter類的額,這里只是做測試。創(chuàng)建完成之后可以看到MyFilter繼承Filter。
public class MyFilter implements Filter
3.在doFilter中實(shí)現(xiàn)防盜鏈
package com.test.cyw; import java.io.IOException; import javax.servlet.Filter; import javax.servlet.FilterChain; import javax.servlet.FilterConfig; import javax.servlet.ServletException; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; import javax.servlet.annotation.WebFilter; import javax.servlet.http.*; /*@WebFilter("/MyFilter")*/ public class MyFilter implements Filter { public MyFilter() { } public void destroy() { } public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { HttpServletRequest req=(HttpServletRequest)request; HttpServletResponse res=(HttpServletResponse)response; String referer=req.getHeader("referer");//鏈接來源地址 if(referer==null||!referer.contains(req.getServerName())) { req.getRequestDispatcher("/Images/err.png").forward(req, res); return; } chain.doFilter(req, res); } public void init(FilterConfig fConfig) throws ServletException { } }
4.Filter配置
上面只是創(chuàng)建了一個(gè)類實(shí)現(xiàn)了Filter接口,如何讓Tomcat知道呢,這和Servlet類似,需要在Web.xml中配置。和配置servlet有點(diǎn)相同。
MyFilter com.test.cyw.MyFilter MyFilter /Images/*
5.測試
新建一個(gè)test.jsp文件,在jsp中顯示img,可以正常顯示
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>Insert title here ![]()
如果直接在瀏覽器輸入test.png的地址,則會顯示err.png
四、遇到的問題
開始的時(shí)候由于地址錯(cuò)誤,導(dǎo)致谷歌瀏覽器test.jsp中顯示的也是err.png的圖片,但當(dāng)我換過來時(shí)刷新頁面還是沒變,這個(gè)讓我很納悶。有時(shí)候?qū)omca重啟也不行,試了好幾次都是這樣,實(shí)在不行了用IE試了下沒想到顯示是正確的,原來谷歌瀏覽器有緩存,導(dǎo)致顯示的不正確。
五、總結(jié)
Filter用處很多,網(wǎng)上也有好多的例子,做項(xiàng)目時(shí)可以先實(shí)現(xiàn)一些常用的例如水印,等用的時(shí)候只需配置下xml就能解決,很是方便。
上述就是小編為大家分享的在JavaWeb項(xiàng)目中如何正確的使用Filter過濾器了,如果剛好有類似的疑惑,不妨參照上述分析進(jìn)行理解。如果想知道更多相關(guān)知識,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。