applicationContext.xml 对比 spring-servlet.xml
参考:https://www.baeldung.com/spring-applicationcontext-vs-spring-servlet-xml
一、过滤器 vs 拦截器
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=============");
}
}
直接实现 WebMvcConfigurer
四、HandlerInterceptor VS ClientHttpRequestInterceptor
用于web请求拦截
接收请求时拦截,实现WebMvcConfigurer,
spring-webmvc项目,org.springframework.web.servlet.HandlerInterceptor HandlerInterceptor拦截的http请求是来自于客户端浏览器之类的,是最常见的http请求拦截器;
用于RestTemplate的定制
发送请求前拦截,
spring-web项目,org.springframework.http.client.ClientHttpRequestInterceptor
Spring提供了ClientHttpRequestInterceptor接口,可以对请求进行拦截,并在其被发送至服务端之前修改请求或是增强相应的信息。