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 添加拦截器配置未生效的问题的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 公众号 接收规则 消息_微信公众平台 发
- 下一篇: 新视窗java_《计算机组成原理实验》教