【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接口,可以对请求进行拦截,并在其被发送至服务端之前修改请求或是增强相应的信息。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· winform 绘制太阳,地球,月球 运作规律
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 上周热点回顾(3.3-3.9)