徹底明白Filter與Interceptor
Filter(過濾器)
概述
Servlet規(guī)范中定義的一種組件,用于在請求進入Servlet之前或響應返回客戶端之前執(zhí)行一些操作。它依賴于Servlet容器,幾乎可以對任何請求進行過濾,隨著Web應用的啟動而啟動,Web應用停止則Filter銷毀。
工作原理
通過實現(xiàn)javax.servlet.Filter,對請求進行過濾攔截,進而做統(tǒng)一處理。最后將請求交給Servlet進行處理并生成得到響應。得到響應以后,F(xiàn)ilter可以對響應再次進行處理。
圖片
應用場景
如進行過濾低俗文字,危險字符,日志記錄、權(quán)限驗證、字符編碼處理等等。如防XSS攻擊的XSSFilter過濾器。
代碼實現(xiàn)(SpringBoot舉例)
創(chuàng)建Filter類
public class MyFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
// 初始化操作
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
// 在請求處理之前執(zhí)行的操作
// 可以對請求進行修改、驗證等操作
chain.doFilter(request, response);
// 在響應返回客戶端之前執(zhí)行的操作
// 可以對響應進行修改、記錄日志等操作
}
@Override
public void destroy() {
// 銷毀操作
}
}
注冊Filter
在Spring Boot中,我們可以通過配置類或使用@WebFilter注解來注冊Filter。
@Configuration
public class FilterConfig {
@Bean
public FilterRegistrationBean<MyFilter> myFilter() {
FilterRegistrationBean<MyFilter> registrationBean = new FilterRegistrationBean<>();
registrationBean.setFilter(new MyFilter());
registrationBean.addUrlPatterns("/api/*"); // 設(shè)置過濾的路徑
return registrationBean;
}
}
Interceptor 攔截器介紹
概述
Interceptor是Spring框架提供的一種攔截器,與Servlet無關(guān),它依賴于Web框架,用于在Controller方法執(zhí)行前后進行處理。與Filter不同,Interceptor是Spring MVC框架特有的組件。它可以將一些共有的行為動作給通用化、標準化,進而讓代碼更加簡潔,可擴展性更高。
原理
圖片
基于實現(xiàn)HandlerInterceptor接口,并重寫它的方法。它有如下方法:
- preHandle方法:目標資源方法執(zhí)行前執(zhí)行。返回true則繼續(xù)往下執(zhí)行 返回false則進行攔截。
- postHandle方法:目標資源方法執(zhí)行后執(zhí)行
- afterCompletion方法:視圖渲染完畢后執(zhí)行,最后執(zhí)行。
應用場景
Interceptor主要用于處理與Controller相關(guān)的邏輯,比如權(quán)限驗證、日志記錄、統(tǒng)一異常處理等。
代碼實現(xiàn)
創(chuàng)建Interceptor類
public class MyInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception {
// 在Controller方法執(zhí)行前執(zhí)行的操作
// 返回true表示繼續(xù)執(zhí)行,返回false表示中斷執(zhí)行
return true;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
ModelAndView modelAndView) throws Exception {
// 在Controller方法執(zhí)行后、視圖渲染前執(zhí)行的操作
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler,
Exception ex) throws Exception {
// 在整個請求完成后執(zhí)行的操作
}
}
注冊Interceptor
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
@Configuration
public class InterceptorConfig implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new MyInterceptor())
.addPathPatterns("/api/**") // 設(shè)置攔截的路徑
.excludePathPatterns("/api/public/**"); // 設(shè)置排除的路徑
}
}
Filter與Interceptor的區(qū)別及如何選擇
執(zhí)行時機不同
- Filter:在請求進入Servlet之前和響應返回客戶端之前執(zhí)行。
- Interceptor:在Controller方法執(zhí)行前、執(zhí)行后、視圖渲染前以及整個請求完成后執(zhí)行。
范圍
- Filter:作用于整個Web應用,不僅限于Spring MVC。
- Interceptor:僅作用于Spring MVC中的Controller層。
使用場景
- Filter:適用于通用的請求處理邏輯,比如字符編碼、日志記錄等。
- Interceptor:適用于與Controller相關(guān)的業(yè)務(wù)邏輯,比如權(quán)限驗證、統(tǒng)一異常處理等。