今天开发调试的时候发现一个问题,一些请求token过期会直接报错500, Server error, 而一些加了注解拦截的请求,依然可以在token过期的情况下成功进入到业务代码
并且在AOP切面代码中打的断点断不下来。
经过排查后,发现是没有加MvcConfigure
@Configuration
public class MvcConfigurer implements WebMvcConfigurer {
/**
* 不需要拦截的请求
*/
private static List<String> execludePathList = new ArrayList<>();
static {
execludePathList.add("/error");
execludePathList.add("/ops/heart");
execludePathList.add("/ops/ready");
}
/**
* 在添加拦截器之前,先创建该bean,纳入到spring中。
* 解决拦截器中无法依赖注入的问题
* @return
*/
@Bean
public UserAuthenticationInterceptor getUserAuthenticationInterceptor(){
return new UserAuthenticationInterceptor();
}
/**
* 在添加拦截器之前,先创建该bean,纳入到spring中。
* 解决拦截器中无法依赖注入的问题
* @return
*/
@Bean
public AdminAuthenticationInterceptor getAdminAuthenticationInterceptor(){
return new AdminAuthenticationInterceptor();
}
@Override
public void addInterceptors(InterceptorRegistry registry) {
// 用户拦截器
registry.addInterceptor(getUserAuthenticationInterceptor()).addPathPatterns("/**").excludePathPatterns(execludePathList);
// 管理后台拦截器
registry.addInterceptor(getAdminAuthenticationInterceptor()).addPathPatterns("/**").excludePathPatterns(execludePathList);
}
}
加上后,重启,不出意外的就可以了。
拦截器不生效的原因还可能有如下的情况
注解未标注齐全
@Componet
@Configuration
是否有多个配置类同时继承了WebMvcConfigurationSupport类
或实现了WebMvcConfigurer, 多个配置类只会生效前一个配置类,后一个配置类不会生效 ;
WebMvcConfigurer和WebMvcConfigurationSupport都是用来配置WebMvc的,WebMvcConfigurer只是WebMvcConfigurationSupport的一个扩展类,它并没有扩展新功能,只是为让用户更方便安全的添加自定义配置 ;
在Spring Boot 1.5版本都是靠重写WebMvcConfigurerAdapter的方法来添加自定义拦截器,消息转换器等。SpringBoot 2.0 后,该类被标记为@Deprecated(弃用)
官方推荐直接实现WebMvcConfigurer或者直接继承WebMvcConfigurationSupport,方式一实现WebMvcConfigurer接口(推荐),方式二继承WebMvcConfigurationSupport类,具体实现可看这篇文章。点击跳转外链