創(chuàng)新互聯www.cdcxhl.cn八線動態(tài)BGP香港云服務器提供商,新人活動買多久送多久,劃算不套路!
創(chuàng)新互聯公司從2013年創(chuàng)立,先為大荔等服務建站,大荔等地企業(yè),進行企業(yè)商務咨詢服務。為大荔企業(yè)網站制作PC+手機+微官網三網同步一站式服務解決您的所有建站問題。這期內容當中小編將會給大家?guī)碛嘘P在JavaWeb項目中如何正確的使用Filter過濾器,文章內容豐富且以專業(yè)的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。
一、由來
客戶端發(fā)起請求,那服務器不能什么請求都做出響應,做攔截處理,不僅能減輕服務器的壓力,還能保護數據的安全,同樣服務端做出響應給客戶端時有時也需要進行過濾,比如我們常見的圖片添加水印。為了處理這些問題,于是過濾器出現了。有時不僅僅對請求與響應進行一層的過濾,可能會過濾多層,所以提出了濾鏡鏈(FilterChain)的概念.
二、使用
在使用它之前先熟悉下它的作用的地方。過濾器作用在請求Request到達Servlet之前以及響應Response到達瀏覽器之前會依次經過過慮鏈。有些類似asp.net中的httpmodule.使用Filter主要是實現javax.servlet.filter接口。查看API可看到有3個方法。
1.public void init(FilterConfig filterConfig) throws ServletException
由 Web 容器調用,指示將放入服務中的過濾器。servlet 容器只在實例化過濾器之后調用一次 init 方法。在要求過濾器做任何過濾工作之前,init 方法必須成功完成。如果 init 方法拋出 ServletException或沒有在 Web 容器定義的時間段內返回,則 Web 容器無法將過濾器放入服務中。這個和Servlet的生命周期有點類似,也是只初始化一次,destroy()也是執(zhí)行一次。
2.public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws java.io.IOException, ServletException
每次由于對鏈末尾的某個資源的客戶端請求而通過鏈傳遞請求/響應對時,容器都會調用 Filter 的 doFilter 方法。傳入此方法的 FilterChain 允許 Filter 將請求和響應傳遞到鏈中的下一個實體。
此方法的典型實現遵循以下模式:
1. 檢查請求
2. 有選擇地將帶有自定義實現的請求對象包裝到用于輸入過濾的過濾器內容或頭中
3. 有選擇地將帶有自定義實現的響應對象包裝到用于輸出過濾的過濾器內容或頭中
4. a) 既可以使用 FilterChain 對象 (chain.doFilter()) 調用鏈中的下一個實體,
4. b) 也可以不將請求/響應對傳遞給過濾器鏈中的下一個實體,從而阻塞請求處理
5. 在調用過濾器鏈中的下一個實體之后直接設置響應上的頭。
3.public void destroy()
由 Web 容器調用,指示將從服務中取出的過濾器。此方法僅在過濾器的 doFilter 方法中的所有線程都已退出之后調用一次,或者在過了超時期之后調用。在調用此方法之后,Web 容器不會再對此過濾器實例調用 doFilter 方法。此方法為過濾器提供了一個清除持有的所有資源(比如內存、文件句柄和線程)的機會,并確保任何持久狀態(tài)都與內存中該過濾器的當前狀態(tài)保持同步。
三、案例
使用過濾器的地方有很多,這里就不一一舉例,下面的demo在上篇博客中HelloWorld項目的基礎上實現防盜鏈的功能,以此體會Filter的使用。
1.準備
在HelloWolrd項目中新增一個文件夾,在文件夾中放入兩個圖片一個err.png 一個test.png,兩個圖如下
2.創(chuàng)建Filter
這里也沒新建Filter包,直接在上一博客中的com.test.cyw包中創(chuàng)建Filter文件MyFilter,應該是創(chuàng)建一個包專門管理Filter類的額,這里只是做測試。創(chuàng)建完成之后可以看到MyFilter繼承Filter。
public class MyFilter implements Filter