springboot 添加拦截器之后中文乱码_spring boot 2.x 添加拦截器配置未生效的问题
背景: 今天有一个需求需要拦截除登录相关请求以外的所有请求,并查看request 中是否包含指定的信息,而自然就想到了使用拦截器就可以轻松实现
编写拦截器,获取请求头信息中的test,并打印出来
@Component
public class AuthorizationInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response,
Object handler) throws Exception {
String testData = request.getHeader("test");
System.err.println(testData);
return true;
}
}
添加拦截器
@Configuration
public class AuthorizationConfig implements WebMvcConfigurer {
@Autowired
AuthorizationInterceptor authorizationInterceptor;
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(authorizationInterceptor).addPathPatterns("/**");
}
}
而当我打上断点后,这里却出现了2个问题
请求却没有到这里来
前端反馈说Swagger文档地址也打不开了
到这里说明我们的配置并没有生效,或者说都失效了,那么有可能是什么原因导致我们的拦截器配置失效呢?
突然想起为支持跨域而添加的配置,如下:
@Configuration
public class CorsConfig extends WebMvcConfigurationSupport {
/* @Autowired
private AuthorizationInterceptor authorizationInterceptor;*/
@Override
protected void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**")
.allowedOrigins("*")
.allowCredentials(true)
.allowedMethods("*").maxAge(3600);
}
}
这里我们也没发现什么异常的地方,只能往SpringBoot 自动加载WebMvc配置的地方看了,默认情况下,SpringBoot是启用WebMvcAutoConfiguration,我们打开WebMvcAutoConfiguration
@Configuration(proxyBeanMethods = false)
@ConditionalOnWebApplication(type = Type.SERVLET)
//@ConditionalOnClass注解表示在环境中存在指定的类才加载此配置
@ConditionalOnClass({Servlet.class, DispatcherServlet.class, WebMvcConfigurer.class})
//@ConditionalOnMissing注解表示在环境中出现了指定的类则不加载此配置
@ConditionalOnMissingBean(WebMvcConfigurationSupport.class)
@AutoConfigureOrder(Ordered.HIGHEST_PRECEDENCE + 10)
@AutoConfigureAfter({ DispatcherServletAutoConfiguration.class, TaskExecutionAutoConfiguration.class,
ValidationAutoConfiguration.class })
public class WebMvcAutoConfiguration {
public static final String DEFAULT_PREFIX = "";
public static final String DEFAULT_SUFFIX = "";
private static final String[] SERVLET_LOCATIONS = { "/" };
....
}
结论: 也就是说我们为添加跨域支持时继承了WebMvcConfigurationSupport,(可以使用webmvcconfigureAdapter ,但是因为我使用的是SpringBoot2.x 以上的版本,该抽象类已经被废弃)而在WebMvc 自动装配的配置类中,指定了WebMvc的加载条件
当环境中(IOC容器)存在Servlet、 DispatcherServlet、 WebMvcConfigurer 时加载WebMvc配置
当环境中存在WebMvcConfigurationSupport Bean时不加载此配置,也就是说不能有WebMvcConfigurationSupport
所以这也就解释了我们新添加的拦截器不生效的原因了!
到这里我们还有如下2个问题:
如何添加自定义的拦截器
Swagger文档访问不了的情况
这2个问题本身就是我们的WebMvc配置因为我们继承使用WebMvcConfigurationSupport 未被加载的原因,查看WebMvcConfigurationSupport 源码发现,在Spring 要获取拦截器链时会调用一个交给子类实现的钩子方法,如下:
//SpringBoot 启动时会调用该方法获取拦截器
protected final Object[] getInterceptors(
FormattingConversionService mvcConversionService,
ResourceUrlProvider mvcResourceUrlProvider) {
if (this.interceptors == null) {
InterceptorRegistry registry = new InterceptorRegistry();
//这里就是交给子类实现的钩子方法,空实现
addInterceptors(registry);
registry.addInterceptor(new ConversionServiceExposingInterceptor(mvcConversionService));
registry.addInterceptor(new ResourceUrlProviderExposingInterceptor(mvcResourceUrlProvider));
this.interceptors = registry.getInterceptors();
}
return this.interceptors.toArray();
}
//交给子类实现的钩子方法
protected void addInterceptors(InterceptorRegistry registry) {
}
所以我们可以直接在添加跨域配置的配置类中重写addInterceptors方法,并在里面添加swagger的HTML的映射
@Configuration
public class CorsConfig extends WebMvcConfigurationSupport {
@Autowired
private AuthorizationInterceptor authorizationInterceptor;
@Override
protected void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**")
.allowedOrigins("*")
.allowCredentials(true)
.allowedMethods("*").maxAge(3600);
}
//这里添加自定义的拦截器
@Override
protected void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(authorizationInterceptor).addPathPatterns("/**");
super.addInterceptors(registry);
}
@Override
protected void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/**").addResourceLocations(
"classpath:/static/");
registry.addResourceHandler("swagger-ui.html").addResourceLocations(
"classpath:/META-INF/resources/");
registry.addResourceHandler("/webjars/**").addResourceLocations(
"classpath:/META-INF/resources/webjars/");
super.addResourceHandlers(registry);
}
}
到这里请求能够到达我们自定义的拦截器中,swagger接口文档地址也能够正常访问!
总结:
@ConditionalOnClass注解表示在环境中存在指定的类才加载此配置
@ConditionalOnMissing注解表示在环境中出现了指定的类则不加载此配置
springboot 添加拦截器之后中文乱码_spring boot 2.x 添加拦截器配置未生效的问题相关推荐
- springboot 添加拦截器之后中文乱码_springboot中配置了拦截器后,拦截器无效的解决方案之一...
springboot的启动类xxxApplication不能扫描到拦截器配置类,可加上@ComponentScan(basePackages={"com.maya.common"} ...
- springboot jar服务器运行后无法请求_Spring Boot微服务中Chaos Monkey的应用
有多少人从未在生产环境中遇到系统崩溃或故障?当然,你们每个人迟早都会经历它.如果我们无法避免失败,那么解决方案似乎是将我们的系统维持在永久性故障状态.Chaos Monkey - 这个概念是Netfl ...
- springboot jar服务器运行后无法请求_Spring boot、微服务、OAuth、OpenID的爱恨情仇!...
在本文中,我们学习如何使用Spring boot轻松配置和部署微服务,然后使用OAuth和OpenID保护它们. 在微服务体系架构中,其中较大的应用程序由多个较小的服务组成,每个服务都有自己的目标,它 ...
- activiti 部署流程图后中文乱码
Activiti工作流引擎使用 1.简单介工作流引擎与Activiti 对于工作流引擎的解释请参考百度百科:工作流引擎 1.1 我与工作流引擎 在第一家公司工作的时候主要任务就是开发OA系统,当然基本 ...
- 在一个JS文件中包含中文字符串,通过innerHTML输出后中文乱码?
在一个JS文件中包含中文字符串,通过innerHTML输出后中文乱码? Posted on 2008-07-13 12:00 尹合磊 阅读(1902) 评论(0) 编辑 收藏 所属分类: ASP.N ...
- 解决 IntelliJ IDEA 中 .propertise 文件保存后中文乱码
解决 IntelliJ IDEA 中 .propertise 文件保存后中文乱码 运行环境: IntelliJ IDEA 2021.3 (Ultimate Edition) 在 IntelliJ ...
- Java的HttpClient类以POST方式提交数据,目标端收到后中文乱码
h ttpClient HttpMethod NameValuePair setRequestBody 今天开发时,遇到利用Java中HttpClient类以POST方式提交数据,目标收到后中文 ...
- CSV文件导入数据库后中文乱码
CSV文件导入数据库后中文乱码 背景:我用的是Dbeaver连接的clickhouse数据库,向现场的同事要了数据(CSV格式文件),导入后都是途中这样的,根本用不了.在网上找到同样的情况的文章,记录 ...
- 记:Nett发送HEX值,转码后中文乱码问题
项目场景: JAVA 使用NETTY框架建立socket数据通讯 问题描述: 服务端将定义好的字符串,转HEX值,回复到客户端,客户端将字符串转码解析后中文乱码 String strTo16 = He ...
最新文章
- how CRM One Order search by contact name work in the past
- 【Python】模拟面试技术面试题答
- 点击button自动提交表单原因及解决方案
- 计算机达人成长之路(8)连载
- JQuery 使用技巧
- 接下来会普及流行能实现《集中授权集中管理,分级授权逐级管理》的标准化权限系统...
- QQBot:基于SmartQQ协议的QQ机器人
- java串口监控数据,怎样监听或者拦截串口上的数据
- java class文件反编译
- 【VTK】装配体Assembly的使用
- jquery获取所有选中的checkbook
- 初识主成分分析 (PCA)
- 在编写网站的时候,给一个div设置背景图片,怎么让这个图片随着div大小的改变,而等比例的缩放。
- 文案排版(参考中文文案排版指北)
- 结果和过程到底哪个重要?
- 上海配眼镜(攻略) ,个人配镜经验总结,你不了解的这里都有!
- java全景图片切割 全景,基于Three.js实现360度全景图片
- 【程序源代码】商城(微信小程序)
- 说说越婢加术汤(黄煌)
- 【金猿投融展】Kyligence——改变人类使用数据的习惯