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注解表示在环境中出现了指定的类则不加载此配置

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/486135.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

等差数列

[编程题] 等差数列时间限制:1秒空间限制:32768K如果一个数列S满足对于所有的合法的i,都有S[i 1] S[i] d, 这里的d也可以是负数和零,我们就称数列S为等差数列。小易现在有一个长度为n的数列x,小易想把x变为一个等差数列。小易允许在数列上做交换任意两…

179.【2023年华为OD机试真题(C卷)】最大坐标值(模拟实现JavaPythonC++JS)

请到本专栏顶置查阅最新的华为OD机试宝典 点击跳转到本专栏-算法之翼:华为OD机试 🚀你的旅程将在这里启航!本专栏所有题目均包含优质解题思路,高质量解题代码,详细代码讲解,助你深入学习,深度掌握! 文章目录 179.【2023年华为OD机试真题(C卷)】最大坐标值(模拟…

2018 UESTC Training for Data Structures

Link A - 一棵简单的线段树 标准线段树 #include<bits/stdc.h> #define ll long long using namespace std;const int maxn 1e67;int n,q; struct node {int l,r,maxx,minx;ll num;ll sum; }t[maxn*4];void build(int x,int l,int r) {t[x].ll,t[x].rr;if(lr){t[x].numt…

linux下的驱动大小,(转)Linux驱动开发需要注意的点/KO大小/内存管理

1.不要想不通就写代码&#xff0c;不要为了存粹的解决问题而加代码&#xff0c;不要忽视任何一种场景可能&#xff0c;因为躲得了一时&#xff0c;躲不了一波&#xff0c;BUG迟早会被挖出来的&#xff0c;到时候更加苦逼。2.内存是个很严肃的问题&#xff0c;不要直接调用系统函…

重磅,2020年度第十届吴文俊人工智能科学技术奖获奖名单公示

来源&#xff1a;科奖圈根据《吴文俊人工智能科学技术奖励条例》和《吴文俊人工智能科学技术奖励实施细则》相关规定&#xff0c;经全国各地方人工智能学会、协会及联盟&#xff0c;各高校及科研&#xff08;院&#xff09;所&#xff0c;学会各专业委员会及工作委会&#xff0…

python封装exe 时间time问题_python模块之datetime

datetime模块简介在开发工作中&#xff0c;我们经常需要用到日期与时间&#xff0c;如&#xff1a;作为日志信息的内容输出计算某个功能的执行时间用日期命名一个日志文件的名称记录或展示某文章的发布或修改时间其他Python中提供了多个用于对日期和时间进行操作的内置模块&…

交错01串

[编程题] 交错01串时间限制&#xff1a;1秒空间限制&#xff1a;32768K如果一个01串任意两个相邻位置的字符都是不一样的,我们就叫这个01串为交错01串。例如: "1","10101","0101010"都是交错01串。小易现在有一个01串s,小易想找出一个最长的连续…

理解 %IOWAIT (%WIO)

%iowait 是 “sar -u” 等工具检查CPU使用率时显示的一个指标&#xff0c;在Linux上显示为 %iowait&#xff0c;在有的Unix版本上显示为 %wio&#xff0c;含义都是一样的。这个指标常常被误读&#xff0c;很多人把它当作I/O问题的征兆&#xff0c;我自己每隔一段时间就会遇到对…

linux系统安装显卡驱动卡顿,关于Ubuntu16.04上N卡驱动导致滚动屏幕卡顿问题

环境Ubuntu16.041080ti显卡问题屏幕显示正常&#xff0c;但是在打开网页或者进行跑深度学习程序的时候画面会发生一卡一下的情况&#xff0c;严重时出现类似于死机的情况。查看系统monitor并不显示显存和内存爆表&#xff0c;于是推断为nvidia显卡驱动不兼容的问题。解决更换显…

自由意志不存在?神经科学能证明不?

来源&#xff1a; 神经现实本文经授权摘自《认知科学对当代哲学的挑战》作者&#xff1a;李恒威神经科学能说明自由意志不存在吗?里贝特是人类意识和自由意志的实验研究领域的先驱性神经科学家&#xff0c;但驱使他开展意识的实证研究的根本动因是回应意识科学研究中的本体论问…

操作序列

[编程题] 操作序列时间限制&#xff1a;2秒空间限制&#xff1a;32768K小易有一个长度为n的整数序列,a_1,...,a_n。然后考虑在一个空序列b上进行n次以下操作:1、将a_i放入b序列的末尾2、逆置b序列小易需要你计算输出操作n次之后的b序列。 输入描述:输入包括两行,第一行包括一个…

南方cass怎么添加指北针_添加比例尺 指北针

添加图例、比例尺、指北针代码中有注释&#xff0c;直接上指北针C#代码publicvoidAddNorthArrow(IPageLayout pageLayout){IGraphicsContainer container pageLayoutasIGraphicsContainer;IActiveView activeView pageLayoutasIActiveView;//获得MapFrameIFrameE…

MySQL数据库order by 奇慢无比

今天遇到个奇葩的问题&#xff0c; sql 数据量很大 有where 和order by&#xff0c;不加order by 速度很快&#xff0c;加了就很慢 一、首先我们对这条sql执行查询计划&#xff1a; explain select t.order_id from book_order t ORDER BY t.order_id desc explain select t.…

独立的小易

[编程题] 独立的小易时间限制&#xff1a;1秒空间限制&#xff1a;32768K小易为了向他的父母表现他已经长大独立了,他决定搬出去自己居住一段时间。一个人生活增加了许多花费: 小易每天必须吃一个水果并且需要每天支付x元的房屋租金。当前小易手中已经有f个水果和d元钱,小易也能…

PNAS “深度学习的科学”论文合集导读

来源&#xff1a;混沌巡洋舰今天的科学家对于机器可以学习做什么的想法与我们10年前完全不同。在图像处理、语音和视频处理、机器视觉、自然语言处理和经典的双人游戏中&#xff0c;特别是在过去的十年中&#xff0c;随着在一系列公共组织的挑战问题&#xff08;例如围棋&#…

s3c6410 jpeg编码 linux,S3C6410 裸机硬件JPEG解码

主函数的部分代码/**************************************************************************************************************************函数 : static PIC_ERROR OpenPictureFile(const char *FileName,u8 *buff,u32 FileMaxSize)*功能 : 打开一张…

注解原理

学习spring时&#xff0c;大量使用了注解&#xff0c;但一直对其底层实现机制不得其解&#xff1a; ref&#xff1a;http://www.cnblogs.com/Johness/archive/2013/04/17/3026689.html ref&#xff1a;https://www.jianshu.com/p/28edf5352b63 ref&#xff1a;http://www.cnblo…

mongodb的delete_大数据技术之MongoDB数据删除

本篇文章探讨了大数据技术之MongoDB数据删除&#xff0c;希望阅读本篇文章以后大家有所收获&#xff0c;帮助大家对相关内容的理解更加深入。1.查看集合show collections2.向集合中添加数据db.runoob.insertOne({title:remove method,url:https://blog.51cto.com/suyanzhu,desc…

C语言中关于字符数组输入,scanf没执行

问题&#xff1a;有时C语言中关于字符数组输入&#xff0c;有的scanf语句没执行。 未执行scanf的代码&#xff1a; #include<stdio.h> int main() {int n;int t0;scanf("%d",&n);char arr[n];int i;for(i0;i<n;i){scanf("%c",&arr[i]);…

清华微电子副所长尹首一:中国AI芯片的技术路线最全面

大数据文摘出品整理&#xff1a;牛婉杨12月1日&#xff0c;GTIC 2020 AI芯片创新峰会在京举办&#xff0c;本次峰会聚集了AI芯片以及各个细分赛道的产、学、研精英人士&#xff0c;共议AI芯片在中国半导体黄金时代的创新与未来。2020年对于AI芯片来说&#xff0c;是充满坎坷的一…