WebMvcConfigurer配置不当导致鉴权失败

最近同事说他们有个新需求,需要对接口进行加解密,所以他给项目配置了一个拦截器,但这个拦截器直接导致所有的接口鉴权失败,每次调用接口都是提示没有session信息。

公司内的所有java项目是公用同一套基础依赖,所以我也为自己的项目配置了一个拦截器,我在启动项目后我请求了项目中的一个接口,session鉴权通过,并未出现他所描述的问题。

归属 代码
本人
同事

对比了下两人的代码,发现基本逻辑是一样,我的代码没有 @EnableWebMvc这个注解,我一般都不加Enable注解,springboot中一般不需要Enable开头的注解,我推测应该是这个注解有问题。查看 @EnableWebMvc注解导入了一个配置类DelegatingWebMvcConfiguration

java 复制代码
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
@Documented
@Import(DelegatingWebMvcConfiguration.class)
public @interface EnableWebMvc {
}

DelegatingWebMvcConfiguration中有setConfigurers方法,这个方法是用了自动注入所有的WebMvcConfigurer

DelegatingWebMvcConfiguration有一个子类EnableWebMvcConfiguration,而EnableWebMvcConfiguration是自动配置类WebMvcAutoConfiguration的一个静态内部类。

自动配置类WebMvcAutoConfiguration 为我们配置了spring mvc方面的过滤器、编解码器、视图解析器等。

WebMvcAutoConfiguration类上有一行注解代码@ConditionalOnMissingBean(WebMvcConfigurationSupport.class) ,它表示只有当spring容器中不存在WebMvcConfigurationSupport类型bean时,此自动配置类才生效。

而我们只要在项目代码中使用EnableWebMvcConfiguration注解,就会向容器中注册一个EnableWebMvcConfiguration注解所导入的DelegatingWebMvcConfiguration类型的Bean,而DelegatingWebMvcConfigurationWebMvcConfigurationSupport的子类。也就是说只要使用了EnableWebMvcConfiguration注解,容器中就会被注册一个WebMvcConfigurationSupport类型的Bean,而WebMvcConfigurationSupport 类型bean存在时,配置类WebMvcAutoConfiguration是不生效的。这样导致springmvc的自动配置全部失效,与此相关的所有配置都需要自己手动配置,而我们项目中的公用基础依赖的鉴权是又要依赖spring mvc的自动配置,那么此时线程上下文中便无法注入session信息,最终导致接口调用时鉴权失败。

所以解决方案是删掉@EnableWebMvc注解,删除掉后一切恢复正常。
建议 :在spring boot环境下,非必要情况下不要加类似@EnableXXX注解,除非你明确知道它是无副作用的。

相关推荐
jasnet_u16 天前
SpringMVC 请求处理深度解析:从 DispatcherServlet 到视图渲染
spring·springmvc·springboot
Cyan_RA917 天前
SpringMVC 数据格式化处理 详解
java·开发语言·spring·mvc·ssm·springmvc·数据格式化
一只大袋鼠19 天前
SpringMVC 框架中的拦截器
java·springmvc·javaweb·拦截器
一只大袋鼠20 天前
SpringMVC全局异常处理
java·开发语言·springmvc·javaweb
一只大袋鼠22 天前
JavaWeb四种文件上传方式(下篇)
java·开发语言·springmvc·javaweb
庞轩px22 天前
第三篇:SpringMVC——一个HTTP请求在Spring中经历了什么?
网络协议·spring·http·springmvc·handlermapping·前端控制器
Cyan_RA923 天前
SpringMVC 视图和视图解析器 万字详解
java·spring·mvc·springmvc·请求重定向·modelandview·视图解析器
javachen__25 天前
Spring MVC 动态支持 JSON/XML 的技巧
spring·springmvc
Cyan_RA91 个月前
SpringMVC 请求数据绑定与参数映射 详解
java·后端·spring·mvc·springmvc·映射请求数据
傻瓜搬砖人1 个月前
SpringMVC简介
springmvc