springboot使用filter获取自定义请求头的实现代码
有个钱包项目,本来用的是微服务这一套,后来感觉没必要,重构成了简单的springboot项目,但是token校验重构完之后出问题了,之前写filter走的是springgateway,基于gatewayfilter实现,重构了之后基于filter,然后当请求进入过滤器的时候,发现不能获取到请求的自定义请求头。
string token = request.getheader("token"); // null string id = request.getheader("id"); // null string role = request.getheader("role"); // null
原因
我在进入断点的时候查看了一下servletrequest,发现请求方法是options。 我知道get post delete put。还真不了解options,百度了下。主要参考这篇文章。原来是浏览器的同源策略问题,也就是cors,可我一想,我配置了cors啊
@configuration public class corsconfig { private corsconfiguration buildconfig() { corsconfiguration corsconfiguration = new corsconfiguration(); corsconfiguration.addallowedorigin("*"); // 1 corsconfiguration.addallowedheader("*"); // 2 corsconfiguration.addallowedmethod("*"); // 3 return corsconfiguration; } @bean public corsfilter corsfilter() { urlbasedcorsconfigurationsource source = new urlbasedcorsconfigurationsource(); source.registercorsconfiguration("/**", buildconfig()); // 4 return new corsfilter(source); } }
怎么还报跨域的问题呢,想起来了我的tokenfilter里因为拿不到请求头token,我抛出了参数异常,然后@restcontrolleradvice跟@exceptionhandle处理不了filter中抛出的异常,导致程序报500错误,然后过滤器是类似于切面的 么,这里断了导致返回头也没加上。
处理
怎么处理浏览器发过来的预处理 options请求呢,太懒了,直接这样写了
httpservletrequest request= (httpservletrequest)servletrequest; httpservletresponse res = (httpservletresponse) servletresponse; string method=request.getmethod(); if(httpmethod.options.tostring().equals(method)){ res.setstatus(httpstatus.no_content.value()); }else { string token = request.getheader("token"); string id = request.getheader("id"); string role = request.getheader("role"); ~~~~~~~
回想
我记得我上个项目也没处理options请求啊,怎么没报cors问题啊,对了我记得我在nginx处理过了
if ($request_method = 'options') { return 204; } add_header access-control-allow-origin * always; add_header access-control-allow-headers "content-type, authorization" always; add_header access-control-allow-methods "get, post, options, put, patch, delete, head" always; add_header access-control-max-age 86400 always;
原来自己又写前端,也写后端,怎么这些问题还能碰到呢,:relieved:,前辈们都写好了,自己还没遇到问题也没深入过,还有springcloud里面的corswebfilter怎么就跟springboot里面的corsfilter不一样呢。
@configuration public class corsconfig { @bean public corswebfilter corsfilter() { corsconfiguration config = new corsconfiguration(); config.addallowedmethod("*"); config.addallowedorigin("*"); config.addallowedheader("*"); urlbasedcorsconfigurationsource source = new urlbasedcorsconfigurationsource(new pathpatternparser()); source.registercorsconfiguration("/**", config); return new corswebfilter(source); } }
还是得多看源码啊,我这个crudboy
总结
以上所述是小编给大家介绍的springboot使用filter获取自定义请求头的实现代码,希望对大家有所帮助