【Spring-WebMVC】
applicationContext.xml 对比 spring-servlet.xml
参考:https://www.baeldung.com/spring-applicationcontext-vs-spring-servlet-xml
一、过滤器 vs 拦截器
过滤器是Servlet规范的一部分,它在请求到达Spring MVC框架之前或响应返回客户端之后执行。过滤器主要用于处理跨域请求、字符编码转换等低级别的任务。
拦截器是Spring MVC框架的一部分,它在请求到达控制器之前或响应返回客户端之前执行,主要用于业务逻辑的预处理和后处理。
Filter的执行由Servlet容器回调完成, 而拦截器通常通过动态代理的方式来执行。
Filter的生命周期由Servlet容器管理, 而拦截器则可以通过IoC容器来管理,因此可以通过注入等方式来获取其他Bean的实例,因此使用会更方便。
过滤器 实现的是 javax.servlet.Filter 接口,而这个接口是在Servlet规范中定义的,也就是说过滤器Filter 的使用要依赖于Tomcat等容器,导致它只能在web程序中使用。
拦截器(Interceptor) 它是一个Spring组件,并由Spring容器管理,并不依赖Tomcat等容器,是可以单独使用的
过滤器Filter是在请求进入容器后,但在进入servlet之前进行预处理,请求结束是在servlet处理完以后。
拦截器 Interceptor 是在请求进入servlet后,在进入Controller之前进行预处理的,Controller 中渲染了对应的视图之后请求结束。

二、应用场景对比
过滤器应用场景
- 过滤敏感词汇(防止sql注入)
- 设置字符编码
- URL级别的权限访问控制
- 压缩响应信息
拦截器应用场景:拦截器本质上是面向切面编程(AOP),符合横切关注点的功能都可以放在拦截器中来实现,主要的应用场景包括:
- 登录验证,判断用户是否登录。
- 权限验证,判断用户是否有权限访问资源,如校验token
- 日志记录,记录请求操作日志(用户ip,访问时间等),以便统计请求访问量。
- 处理cookie、本地化、国际化、主题等。
- 性能监控,监控请求处理时长等。
- 通用行为:读取cookie得到用户信息并将用户对象放入请求,从而方便后续流程使用,还有如提取Locale、Theme信息等,只要是多个处理器都需要的即可使用拦截器实现)

三、 定制Filter
参考:https://www.techiedelight.com/zh/how-to-define-custom-filters-spring-boot-application/
- 方法1:注册成Component,被spring识别到
限制:上述过滤器适用于所有请求
或 扩展
- 方法2:注册一个FilterRegistrationBean(SpringBoot)类型的@Bean: 可指定影响的URL


- 方法3:使用Servlet的@WebFilter注解

四、定制拦截器:基于WebMvcConfigurer接口
参考spring-web.pdf,如下均可以定制;参考:https://blog.csdn.net/pan_junbiao/article/details/120039885

官方推荐直接实现 WebMvcConfigurer(Spring定义,推荐) 或者直接继承 WebMvcConfigurationSupport // WebMvcConfigurerAdapter被标记为 @Deprecated
步骤1、自定义拦截器
public class MyInterceptor implements HandlerInterceptor { @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) { System.out.println("=============MyInterceptor:preHandle============="); System.out.println("MyInterceptor: get(key)=" + request.getAttribute("key")); return true; } @Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) { System.out.println("=============MyInterceptor::postHandle============="); } }
步骤2、注册:直接实现 WebMvcConfigurer

springboot 拦截器的坑 WebMvcConfigurationSupport 失效 https://juejin.cn/post/7082726762328621086
如果项目中出现了一次 extends WebMvcConfigurationSupport ,其他的 extends WebMvcConfigurationSupport 和 implements WebMvcConfigurer 会失效 。
四、HandlerInterceptor VS ClientHttpRequestInterceptor
1、HandlerInterceptor接口:用于web请求拦截
接收请求时拦截,实现WebMvcConfigurer,
spring-webmvc项目,org.springframework.web.servlet.HandlerInterceptor
HandlerInterceptor拦截的http请求是来自于客户端浏览器之类的,是最常见的http请求拦截器;
2、ClientHttpRequestInterceptor接口:用于RestTemplate的定制
发送请求前拦截,
spring-web项目,org.springframework.http.client.ClientHttpRequestInterceptor
Spring提供了ClientHttpRequestInterceptor接口,可以对请求进行拦截,并在其被发送至服务端之前修改请求或是增强相应的信息。

浙公网安备 33010602011771号