1.概述
拦截器属于 Spring MVC 中的内容,能够在Controller
中的方法执行前、后进行额外的逻辑处理,常用于权限控制、日志记录、接口幂等性校验、数据校验、缓存处理等场景。
2.快速开始
0)SpringBoot基本环境搭建
1)自定义拦截器,实现HandlerInterceptor
接口
public class TestInterceptor implements HandlerInterceptor {
// 预处理方法,在Controller方法执行前执行。返回true则放行,继续执行controller方法;返回false则不放行,可由request或response跳转
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println("拦截器:预处理方法");
return true;
}
// 后处理方法,在Controller方法执行后执行
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable ModelAndView modelAndView) throws Exception {
System.out.println("拦截器:后处理方法");
}
// 成功返回页面后执行
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable Exception ex) throws Exception {
System.out.println("拦截器:页面响应完成");
}
}
2)注册拦截器到InterceptorRegistry
,并配置拦截路径
// 新建配置类(注意加@Configuration注解),实现WebMvcConfigurer接口,并重写addInterceptors()方法
@Configuration
public class WebMvcConfig implements WebMvcConfigurer {
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new TestInterceptor()) // 注册拦截器到InterceptorRegistry,使其生效
.addPathPatterns("/hello") // 拦截器拦截的路径
.excludePathPatterns(""); // 拦截器放行的路径
}
}
3)效果展示
本地启动项目,访问http://localhost:8080/hello,控制台打印如下
拦截器:预处理方法
执行controller中的方法:hello
拦截器:后处理方法
拦截器:页面响应完成
3.拦截器的实际应用(TODO)
4.用户请求的执行顺序
请求进入容器 > 进入过滤器 > 进入 Servlet > 进入拦截器 > 执行控制器(Controller),如下图所示(图片来自参考[2]):
5.使用拦截器的注意事项
1)减少拦截器数量:尽量将相关功能集中到一个拦截器中,避免创建过多的拦截器。
2)精确配置拦截规则:通过addPathPatterns和excludePathPatterns方3)法精确配置拦截规则,避免不必要的拦截。
4)使用异步处理:在拦截器中使用异步处理,避免阻塞请求处理过程。
5)使用缓存:在拦截器中使用缓存,减少对数据库或其他资源的访问。
参考
[1] 全面了解SpringBoot拦截器
[2] 过滤器和拦截器有什么区别