springboot使用filter获取自定义请求头的实现代码
有个钱包项目,本来用的是微服务这一套,后来感觉没必要,重构成了简单的springboot项目,但是token校验重构完之后出问题了,之前写filter走的是springgateway,基于GatewayFilter实现,重构了之后基于filter,然后当请求进入过滤器的时候,发现不能获取到请求的自定义请求头。
Stringtoken=request.getHeader("token");//null
Stringid=request.getHeader("id");//null
Stringrole=request.getHeader("role");//null
原因
我在进入断点的时候查看了一下servletRequest,发现请求方法是options。我知道getpostdeleteput。还真不了解options,百度了下。主要参考这篇文章。原来是浏览器的同源策略问题,也就是cors,可我一想,我配置了cors啊
@Configuration
publicclassCorsConfig{
privateCorsConfigurationbuildConfig(){
CorsConfigurationcorsConfiguration=newCorsConfiguration();
corsConfiguration.addAllowedOrigin("*");//1
corsConfiguration.addAllowedHeader("*");//2
corsConfiguration.addAllowedMethod("*");//3
returncorsConfiguration;
}
@Bean
publicCorsFiltercorsFilter(){
UrlBasedCorsConfigurationSourcesource=newUrlBasedCorsConfigurationSource();
source.registerCorsConfiguration("/**",buildConfig());//4
returnnewCorsFilter(source);
}
}
怎么还报跨域的问题呢,想起来了我的tokenFilter里因为拿不到请求头token,我抛出了参数异常,然后@RestControllerAdvice跟@ExceptionHandle处理不了filter中抛出的异常,导致程序报500错误,然后过滤器是类似于切面的么,这里断了导致返回头也没加上。
处理
怎么处理浏览器发过来的预处理options请求呢,太懒了,直接这样写了
HttpServletRequestrequest=(HttpServletRequest)servletRequest;
HttpServletResponseres=(HttpServletResponse)servletResponse;
Stringmethod=request.getMethod();
if(HttpMethod.OPTIONS.toString().equals(method)){
res.setStatus(HttpStatus.NO_CONTENT.value());
}else{
Stringtoken=request.getHeader("token");
Stringid=request.getHeader("id");
Stringrole=request.getHeader("role");
~~~~~~~
回想
我记得我上个项目也没处理options请求啊,怎么没报cors问题啊,对了我记得我在nginx处理过了
if($request_method='OPTIONS'){
return204;
}
add_headerAccess-Control-Allow-Origin*always;
add_headerAccess-Control-Allow-Headers"Content-Type,Authorization"always;
add_headerAccess-Control-Allow-Methods"GET,POST,OPTIONS,PUT,PATCH,DELETE,HEAD"always;
add_headerAccess-Control-Max-Age86400always;
原来自己又写前端,也写后端,怎么这些问题还能碰到呢,:relieved:,前辈们都写好了,自己还没遇到问题也没深入过,还有springcloud里面的corsWebFilter怎么就跟springboot里面的corsFilter不一样呢。
@Configuration
publicclassCorsConfig{
@Bean
publicCorsWebFiltercorsFilter(){
CorsConfigurationconfig=newCorsConfiguration();
config.addAllowedMethod("*");
config.addAllowedOrigin("*");
config.addAllowedHeader("*");
UrlBasedCorsConfigurationSourcesource=newUrlBasedCorsConfigurationSource(newPathPatternParser());
source.registerCorsConfiguration("/**",config);
returnnewCorsWebFilter(source);
}
}
还是得多看源码啊,我这个crudboy
总结
以上所述是小编给大家介绍的springboot使用filter获取自定义请求头的实现代码,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对毛票票网站的支持!