過濾器和攔截器的區別

一、過濾器(filter)

過濾器(filter),客服端與web資源之間的請求和響應都透過過濾器進行過濾。比如web前端和服務端進行互動,但埠號又不一樣,這樣就存在了跨域問題,可以透過配置過濾器解決。

1、SpringBoot中前後端跨域問題解決方式:過濾器

import org。springframework。stereotype。Component; import javax。servlet。*;import javax。servlet。annotation。WebFilter;import javax。servlet。http。HttpServletResponse;import java。io。IOException;@Component@WebFilter(urlPatterns = “/*”, filterName = “authFilter”) //這裡的“/*” 表示的是需要攔截的請求路徑public class PassHttpFilter implements Filter { @Override public void init(FilterConfig filterConfig) throws ServletException { } @Override public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { HttpServletResponse httpResponse = (HttpServletResponse)servletResponse; httpResponse。setHeader(“Access-Control-Allow-Headers”,“Origin, X-Requested-With, Content-Type, Accept”); httpResponse。setHeader(“Access-Control-Allow-Credentials”, “true”); httpResponse。addHeader(“Access-Control-Allow-Origin”, “http://127。0。0。1:8020”); filterChain。doFilter(servletRequest, httpResponse); } @Override public void destroy() { }}

2、禁止訪問某IP地址

客戶端發出訪問某IP地址時,經過過濾器後,客戶端得到的響應是出現該IP地址禁止被訪問的提示。在Javaweb中,傳入的request、response提前過濾一些資訊,或者提前設定一些引數,然後再傳入servlet或者struts的action進行業務邏輯,比如過濾掉非法url,或者傳入servlet或者struts的action前統一設定字符集,或者去掉一些非法字元。

二、攔截器(interceptor)

攔截器是面向切面程式設計的,面向切面就是將多個模組的通用服務進行分離,如許可權管理、日誌服務,它們在多個模組中都會用到,就可以將其各自封裝為一個可用模組。而這些通用服務的具體實現是透過攔截器來完成。比如使用者客戶端訪問一些保密模組都先透過許可權審查的攔截器進行許可權審查,確定使用者是否具有該項操作的許可權後才能向下執行。

面向介面程式設計就是在你的service或者一個方法前,呼叫一個方法,或者在方法後呼叫一個方法,比如動態代理就是攔截器的簡單實現,在你呼叫方法前打印出字串,也可以在呼叫方法後打印出字串,甚至在丟擲異常的時候做業務邏輯的操作。

三、過濾器和攔截器的區別

過濾器依賴於servlet,攔截器不依賴servlet;

過濾器基於函式回撥,攔截器基於Java的反射機制;

過濾器可對所有請求起作用,攔截器只對action請求起作用;

在action的宣告週期中,攔截器可以多次被呼叫,而過濾器只能在容器初始化時被呼叫一次;