java web過濾器你瞭解嗎?(Filter和ChainFilter鏈)
1、什麼是過濾器?
在客戶端到伺服器的過程中,當傳送請求時,如果有不符合的資訊將會被filter進行攔截,如果符合則會進行放行,在伺服器給客戶端響應時也會進行判斷 如果有不符合的資訊將會被filter進行攔截,如果符合則會進行放行。
OOP:Java面向物件程式設計,抽象、封裝、繼承、多型。
AOP:面向切面程式設計,過濾器就是一個面向切面的程式設計思想。
AOP是sun公司srvlet2.3版本之後推出的新功能,在2.3之前的版本沒有該功能,定義一個過濾器需要實現(implement)Filter介面,這裡實現的是javax.servlet.Filter。
過濾器是一個程式,它先於與之相關的servlet或JSP頁面執行在伺服器上。過濾器可附加到一個或多個servlet或JSP頁面上,並且可以檢查進入這些資源的請求資訊。在這之後,過濾器可以作如下的選擇:
①以常規的方式呼叫資源(即,呼叫servlet或JSP頁面)。
②利用修改過的請求資訊呼叫資源。
③呼叫資源,但在傳送響應到客戶機前對其進行修改。
④阻止該資源呼叫,代之以轉到其他的資源,返回一個特定的狀態程式碼或生成替換輸出。
2、過濾器的生命週期:
在專案開始啟動的時候,過濾器開始初始化,當有請求來的時候開始自動去執行doFilter方法,隨著專案的關閉過濾器開始停止。
3、過濾器有什麼用?
過濾器主要的作用是過濾請求,可以通過Filter技術,web伺服器管理的所有web資源:例如:JSP、Servlet、靜態圖片檔案、或靜態HTML檔案進行攔截,從而實現一些特殊功能,例如:實現URL級別的許可權控制、過慮敏感詞彙、壓縮響應資訊等一些高階功能。
4、該怎麼用?
可以寫多個,從使用者訪問——》第一個過濾器——》第二個過濾器——》Servlet
過濾器的生命週期:隨著專案的啟動而建立,當訪問了地址後而呼叫doFilter方法,這個會多次執行,隨著專案的關閉而銷燬。
呼叫doFilter方法時有三個引數:
reqest(ServletRequest)——》HttpServletRequest(注意強轉:在使用HttpServletRequest這個獨有的方法時要強轉)
response(ServletResponse)——》HttpServletResponse(注意強轉:在使用HttpServletResponse這個獨有的方法時要強轉)
filterchain 鏈 可以指向下一個地址(如果有過濾器則指向下一個過濾器,沒有指向資源Servlet) 過濾、攔截、放行
chain.doFilter(req,resp);//放行
ChainFilter鏈:
它可以指向下一個資源,如果還有過濾器,則繼續進行下一次的過濾,如果沒有過濾器,則會指向資源(servlet)。
filter應用場景:
(1).為所有的Servlet設定編碼
(2).設定跨域問題
(3).解決所有的防盜鏈問題
使用過濾器的時候需要配置的檔案:
(1)、固定地址
(2)、萬用字元
(3)、指定目錄
過濾器程式碼奉上:
package servlet;
import javax.servlet.*;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
/**
* urlPattern={"/*"}獲取所有的Servlet的對映路徑,實現不同Servlet之間的互動
*/
@WebServlet(name = "DemoFilter",urlPatterns = {"/*"})
public class DemoFilter implements Filter{
/**
* 過濾器的初始化方法
* @param filterConfig 可以獲取部署描述符檔案(web.xml)中分配的過濾器初始化引數。
* @throws ServletException
*/
@Override
public void init(FilterConfig filterConfig) throws ServletException {
System.out.println("過濾器被建立了");
}
/**
*
* @param servletRequest 請求
* @param servletResponse 響應
* @param filterChain 鏈條,對過濾器進行阻止和放行
* @throws IOException
* @throws ServletException
*/
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
System.out.println("過濾器被執行了");
servletResponse.setContentType("text/html,charset=utf-8");
HttpServletRequest request = (HttpServletRequest) servletRequest;
HttpServletResponse response = (HttpServletResponse) servletResponse;
response.addHeader("Access-Control-Allow-Origin","*");
String referer = request.getHeader("referer");
System.out.println(referer);
filterChain.doFilter(servletRequest,servletResponse);//放行
}
@Override
public void destroy() {
System.out.println("過濾器被銷燬了");
}
}