1、前言
拦截器的主要作用:登录校验、权限验证、乱码解决、性能监控和异常处理等
在 Spring Boot 项目中,使用拦截器功能通常需要以下 3 步:
- 定义拦截器
- 注册拦截器
- 指定拦截规则
2、定义拦截器
HandlerInterceptor 接口中定义以下 3 个方法,如下表。
返回值类型 | 方法声明 | 描述 |
boolean | preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) | preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) |
void | postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) | 该方法在控制器处理请求方法调用之后、解析视图之前执行,可以通过此方法对请求域中的模型和视图做进一步修改。 |
void | afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) | 该方法在视图渲染结束后执行,可以通过此方法实现资源清理、记录日志信息等工作。 |
/** * 通用拦截器 */ public class CommonInterceptor implements HandlerInterceptor { @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { return true; } @Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { } @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { } }
3、注册拦截器
创建一个实现了 WebMvcConfigurer 接口的配置类(使用了 @Configuration 注解的类),重写 addInterceptors() 方法
@Configuration public class MvcConfig implements WebMvcConfigurer { /** * 注册自定义的拦截器 * @param registry */ @Override public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(new CommonInterceptor()); } }
4、指定拦截规则
如果是拦截所有,静态资源也会被拦截
@Configuration public class MvcConfig implements WebMvcConfigurer { /** * 注册自定义的拦截器 * @param registry */ @Override public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(new CommonInterceptor()).addPathPatterns("/**")//拦截所有请求 .excludePathPatterns("/","/login","*.html","/images/**");//放行的请求 } }