解决SpringBoot自定义拦截器和跨域配置冲突的问题
程序员文章站
2022-03-13 11:51:05
目录springboot自定义拦截器和跨域配置冲突springboot 拦截器和addcorsmappings冲突springboot自定义拦截器和跨域配置冲突技术栈vue-cli3,springbo...
springboot自定义拦截器和跨域配置冲突
技术栈
vue-cli3,springboot 2.3.2.release
问题引出
在做毕业设计过程中用到了自定义拦截器验证登录。同时在springboot配置类中设置了跨域问题,出现跨域失败的情况。
原代码
@configuration public class webconfig extends webmvcconfigurationsupport { @override protected void addcorsmappings(corsregistry registry) { registry.addmapping("/**") .allowedorigins("*") .allowedmethods("get", "head", "post","put", "delete", "options") .allowedheaders("*") .maxage(3600); super.addcorsmappings(registry); } @override protected void addinterceptors(interceptorregistry registry) { registry.addinterceptor(new authinterceptor()) .addpathpatterns("/**") .excludepathpatterns("/login/*","/register/*"); } }
经过了解和排查发现,当有请求发送到后台时,先被自定义拦截器拦截,如果拦截器验证没有问题,才会开始执行跨域配置。因此解决办法是让跨域配置在自定义拦截器之前执行。而filter的执行顺序大于自定义拦截器,因此可以在filter中实现跨域的配置。
新代码
@configuration public class webconfig extends webmvcconfigurationsupport { @override protected void addinterceptors(interceptorregistry registry) { registry.addinterceptor(new authinterceptor()) .addpathpatterns("/**") .excludepathpatterns("/login/*","/register/*"); } }
添加filter
@configuration public class mycorsfilter{ private corsconfiguration corsconfig(){ corsconfiguration corsconfiguration = new corsconfiguration(); corsconfiguration.addallowedheader("*"); corsconfiguration.addallowedmethod("*"); corsconfiguration.addallowedorigin("*"); corsconfiguration.setmaxage(3600l); corsconfiguration.setallowcredentials(true); return corsconfiguration; } @bean public corsfilter corsfilter(){ urlbasedcorsconfigurationsource source = new urlbasedcorsconfigurationsource(); source.registercorsconfiguration("/**",corsconfig()); return new corsfilter(source); } }
springboot 拦截器和addcorsmappings冲突
项目中最开始跨域问题是通过自定义过滤器corsfilter对request处理的,可以很好的解决问题。
最近,新项目中准备通过如下代码解决跨域问题,结果发现登录超时的错误会出现跨域问题,其他问题都不会。
@configuration public class webconfig extends webmvcconfigureradapter { @override public void addcorsmappings(corsregistry registry) { registry.addmapping("/**"); } }
因为登录超时的检查是在拦截器中,所以推测是可能是拦截器的执行在addcorsmappings生效之前。将corsfilter代码拿到项目中后,果然没有这个问题了。所以这个bu基本上可以认定是是拦截器和addcorsmappings生效顺序的问题。
以上为个人经验,希望能给大家一个参考,也希望大家多多支持。
推荐阅读
-
Springboot解决ajax+自定义headers的跨域请求问题
-
vue中axios解决跨域问题和拦截器的使用方法
-
springboot跨域过滤器与swagger拦截器冲突的解决方案
-
解决SpringBoot自定义拦截器和跨域配置冲突的问题
-
个人笔记 -- Axios封装原理、console.log()和console.dir()的区别、开发环境解决跨域问题、Vue设置全局自定义指令、cookies和localstorage区别
-
vue中axios解决跨域问题和拦截器的使用方法
-
vue中axios解决跨域问题和拦截器的使用方法
-
vue中axios解决跨域问题和拦截器的使用方法
-
解决SpringBoot自定义拦截器和跨域配置冲突的问题