背景: 今天有一个需求需要拦截除登录相关请求以外的所有请求,并查看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 添加拦截器配置未生效的问题相关推荐

  1. springboot 添加拦截器之后中文乱码_springboot中配置了拦截器后,拦截器无效的解决方案之一...

    springboot的启动类xxxApplication不能扫描到拦截器配置类,可加上@ComponentScan(basePackages={"com.maya.common"} ...

  2. springboot jar服务器运行后无法请求_Spring Boot微服务中Chaos Monkey的应用

    有多少人从未在生产环境中遇到系统崩溃或故障?当然,你们每个人迟早都会经历它.如果我们无法避免失败,那么解决方案似乎是将我们的系统维持在永久性故障状态.Chaos Monkey - 这个概念是Netfl ...

  3. springboot jar服务器运行后无法请求_Spring boot、微服务、OAuth、OpenID的爱恨情仇!...

    在本文中,我们学习如何使用Spring boot轻松配置和部署微服务,然后使用OAuth和OpenID保护它们. 在微服务体系架构中,其中较大的应用程序由多个较小的服务组成,每个服务都有自己的目标,它 ...

  4. activiti 部署流程图后中文乱码

    Activiti工作流引擎使用 1.简单介工作流引擎与Activiti 对于工作流引擎的解释请参考百度百科:工作流引擎 1.1 我与工作流引擎 在第一家公司工作的时候主要任务就是开发OA系统,当然基本 ...

  5. 在一个JS文件中包含中文字符串,通过innerHTML输出后中文乱码?

    在一个JS文件中包含中文字符串,通过innerHTML输出后中文乱码? Posted on 2008-07-13 12:00 尹合磊 阅读(1902) 评论(0)  编辑 收藏 所属分类: ASP.N ...

  6. 解决 IntelliJ IDEA 中 .propertise 文件保存后中文乱码

    解决 IntelliJ IDEA 中 .propertise 文件保存后中文乱码 运行环境: IntelliJ IDEA 2021.3 (Ultimate Edition)   在 IntelliJ ...

  7. Java的HttpClient类以POST方式提交数据,目标端收到后中文乱码

     h ttpClient HttpMethod NameValuePair setRequestBody 今天开发时,遇到利用Java中HttpClient类以POST方式提交数据,目标收到后中文 ...

  8. CSV文件导入数据库后中文乱码

    CSV文件导入数据库后中文乱码 背景:我用的是Dbeaver连接的clickhouse数据库,向现场的同事要了数据(CSV格式文件),导入后都是途中这样的,根本用不了.在网上找到同样的情况的文章,记录 ...

  9. 记:Nett发送HEX值,转码后中文乱码问题

    项目场景: JAVA 使用NETTY框架建立socket数据通讯 问题描述: 服务端将定义好的字符串,转HEX值,回复到客户端,客户端将字符串转码解析后中文乱码 String strTo16 = He ...

最新文章

  1. how CRM One Order search by contact name work in the past
  2. 【Python】模拟面试技术面试题答
  3. 点击button自动提交表单原因及解决方案
  4. 计算机达人成长之路(8)连载
  5. JQuery 使用技巧
  6. 接下来会普及流行能实现《集中授权集中管理,分级授权逐级管理》的标准化权限系统...
  7. QQBot:基于SmartQQ协议的QQ机器人
  8. java串口监控数据,怎样监听或者拦截串口上的数据
  9. java class文件反编译
  10. 【VTK】装配体Assembly的使用
  11. jquery获取所有选中的checkbook
  12. 初识主成分分析 (PCA)
  13. 在编写网站的时候,给一个div设置背景图片,怎么让这个图片随着div大小的改变,而等比例的缩放。
  14. 文案排版(参考中文文案排版指北)
  15. 结果和过程到底哪个重要?
  16. 上海配眼镜(攻略) ,个人配镜经验总结,你不了解的这里都有!
  17. java全景图片切割 全景,基于Three.js实现360度全景图片
  18. 【程序源代码】商城(微信小程序)
  19. 说说越婢加术汤(黄煌)
  20. 【金猿投融展】Kyligence——改变人类使用数据的习惯

热门文章

  1. K 近邻法(K-Nearest Neighbor, K-NN)
  2. LeetCode 648. 单词替换(Trie树)
  3. Python判断变量是否存在的方法
  4. Facebook大公开:解决NLG模型落地难题!工业界的新一波春天?
  5. 从前,小夕种了一棵树
  6. 史上最强多线程面试44题和答案:线程锁+线程池+线程同步等
  7. 论文浅尝 | Wordly Wise(WoW) - 用于语音视觉知识问答的跨语言知识融合模型
  8. Nginx 简介和使用
  9. 百年诺奖的那些争议与放弃
  10. Zookeeper实现Master选举(哨兵机制)