前言:
用SpringBoot做微服务,必不可少的要处理各种认证、XSS、加解密问题,需要用到过滤器、拦截器、AOP,这里记录如何优雅的使用拦截器做请求拦截预处理。
1 实现类
实现HandlerInterceptor接口。
继承实现HandlerInterceptor接口的实现类,例如:HandlerInterceptorAdapter。
实现AsyncHandlerInterceptor接口。
这里只展示实现HandlerInterceptor接口和AsyncHandlerInterceptor介绍。
1.1 HandlerInterceptor接口介绍
实现HandlerInterceptor接口提供了三个方法,选择需要的将他们实现。
(1)preHandle:业务处理请求前被调用,若返回值为true则拦截放过,若返回值false请求被中止。
(2)postHandle:Controller请求后返回视图前处理。
(3)afterCompletion:Controller请求返回后处理。
1.2 AsyncHandlerInterceptor接口介绍
AsyncHandlerInterceptor接口比HandlerInterceptor增加了一个方法afterConcurrentHandlingStarted,该接口方法是在使用了异步的方法时调用,例如:controller请求内调用了含@Async的方法,会触发afterConcurrentHandlingStarted方法执行,触发前还是先执行preHandle。
2 配置
将拦截器加入到MVC中有三种方式,都是在扩展类中重写父类方法如下:
(1) @EnableWebMvc + implements WebMvcConfigurer
注意:这种方式会屏蔽掉SpringBoot对SpringMVC的自动配置!
(2)@Configuration + implements WebMvcConfigurer
这种方式最安全,不会屏蔽掉SpringBoot对SpringMVC的自动配置,推荐使用。
(3)@Configuration + extends WebMvcConfigurationSupport
注意:这种方式会屏蔽掉SpringBoot对SpringMVC的自动配置!
2.1 详解MVC自动配置生效问题
踩坑原因:swagger2访问失效404
上述方法(1)(2)导致自动配置生效,首先我们看一下自动配置类WebMvcAutoConfiguration的源码定义:
SpringBoot自动配置类WebMvcAutoConfiguration上有条件注解
@ConditionalOnMissingBean(WebMvcConfigurationSupport.class)
这个注解的意思是,在项目类中,缺少WebMvcConfigurationSupport类型的bean时,改用自动配置,如果具有该类型bean,自动配置生效,需要在该类型bean中自己重写需要的配置。
如果不愿意重写配置,可以使用(2)@Configuration + implements WebMvcConfigurer方式配置。
2.2 @Configuration + implements WebMvcConfigurer方式配置
@Configuration
public class WebRequestConfig implements WebMvcConfigurer {
/**
* 实现类
*/
@Autowired
private AppMarkIdInterceptor appMarkIdInterceptor;
@Override
public void addInterceptors(InterceptorRegistry registry) {
// 自定义拦截器,指定拦截路径和排除拦截路径
registry.addInterceptor(appMarkIdInterceptor).addPathPatterns("/**");
}