646 字
3 分钟
Spring中拦截器和过滤器的区别
https://www.mianshiya.com/question/1907425766060380162#heading-0
过滤器
实现机制
过滤器是Servlet规范的一部分,独立于Spring存在,主要用于过滤请求和响应,可以对所有类型的请求进行处理。
使用范围
可以过滤所有的请求,包括静态资源,jsp,html等,因为它在Servlet容器层面生效。
配置方法
需要实现Filter接口,通过标准的Servlet配置方式进行注册: https://www.cnblogs.com/xfeiyun/p/15790555.html
https://juejin.cn/post/7000950677409103880
执行顺序
先于拦截器执行,因为过滤器作用于Servlet容器层面,拦截器作用在Spring MVC 的处理器映射器找到控制器前或者后执行。
功能侧重
侧重于过滤请求和响应的内容,比如设置编码格式,安全控制等。
拦截器
实现机制
拦截器是Spring框架的一部分,基于Java的反射机制实现,主要针对的是Handler的调用
使用范围
主要用于拦截访问DispathcherServlet的请求,通常只适用于Spring MVC的应用程序中的请求处理方法。
配置方式
需要实现org.springframework.web.servlet.HandlerInterceptor接口,并在Spring配置文件中进行注册。
可以通过实现WebMvcConfigurer接口的addInterceptors方法来进行注册。
package com.example.interceptor;
import jakarta.servlet.http.HttpServletRequest;import jakarta.servlet.http.HttpServletResponse;import org.springframework.web.servlet.HandlerInterceptor;import org.springframework.web.servlet.ModelAndView;
/** * @author wipe * @version 1.0 */
public class MyInterceptor1 implements HandlerInterceptor {
@Override//目标资源方法执行前执行。 返回true:放行 返回false:不放行 public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println("MyInterceptor1 ... preHandle"); return true; }
@Override//目标资源方法执行后执行 public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { System.out.println("MyInterceptor1 ... postHandle"); }
@Override//视图渲染完毕后执行,最后执行 public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { System.out.println("MyInterceptor1 ... afterCompletion"); }}
package com.example.config;
import com.example.filter.MyFilter1;import com.example.filter.MyFilter2;import com.example.interceptor.MyInterceptor1;import com.example.interceptor.MyInterceptor2;import org.springframework.boot.web.servlet.FilterRegistrationBean;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;import org.springframework.web.servlet.config.annotation.InterceptorRegistry;import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;/** * @author wipe * @version 1.0 */@Configurationpublic class MyConfig implements WebMvcConfigurer {
@Override public void addInterceptors(InterceptorRegistry registry) { // 添加拦截器,并指定执行顺序,也可以通过将拦截器声明成 bean 对象,然后通过 @Order 注解或者实现 Order 接口指定执行顺序 registry.addInterceptor(new MyInterceptor1()).order(1); registry.addInterceptor(new MyInterceptor2()).order(2); }
@Bean// 这样配置可以指定过滤器的执行顺序 public FilterRegistrationBean<MyFilter1> myFilter1() { FilterRegistrationBean<MyFilter1> filter = new FilterRegistrationBean<>(); filter.setFilter(new MyFilter1()); filter.addUrlPatterns("/*"); filter.setOrder(1); return filter; }
@Bean public FilterRegistrationBean<MyFilter2> myFilter2() { FilterRegistrationBean<MyFilter2> filter = new FilterRegistrationBean<>(); filter.setFilter(new MyFilter2()); filter.addUrlPatterns("/*"); filter.setOrder(2); return filter; }}
也可以直接用@Component注册Interceptor
执行顺序
可以指定多个拦截器之间的执行顺序,通过实现Ordered接口或者使用@Order注解来控制。
功能侧重
侧重于业务逻辑的前置检查,权限验证,日志记录等。