SpringMVC跨域问题排查以及源码实现

本文详细探讨了在SpringMVC中遇到的跨域问题,包括出现的原因、常见解决办法,并深入源码层面理解SpringMVC如何处理跨域请求。通过配置CORS过滤器和使用注解@CrossOrigin,讲解了实现跨域访问的两种主要方式,旨在帮助开发者更好地理解和解决实际项目中的跨域问题。
摘要由CSDN通过智能技术生成
SpringMVC跨域问题排查以及源码实现
最近一次项目中,将SpringMVC版本从4.1.1升级到4.3.10,出现跨域失败的情况。关于同源策略和跨域解决方案,网上有很多资料。
项目采用的方式是通过实现过滤器Filter,在Response返回头文件添加跨域资源共享(CORS) 相关的参数。
response.addHeader("Access-Control-Allow-Origin", "http://test.com");
response.addHeader("Access-Control-Allow-Credentials", "true");
response.addHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE, PUT, HEAD");
response.addHeader("Access-Control-Allow-Headers", "Content-Type");
response.addHeader("Access-Control-Max-Age", "3600");
发布完成,回归测试的过程发现跨域失败,但是本地开发是没有问题的。
经过排查线下和线上的区别,因为是前后端分离项目,所以线上基本会配置前端和后端独立的域名,通过跨域的方式调用。但是本地开发的时候,前端通过nginx配置转发请求到后端服务,也就避开了跨域的问题。所以为了不影响线上环境,先暂时把线上的调用改成和线下一致,服务正常。
后面开始排查具体的失败问题,开始排查的几个点:
4.1.1到4.3.10 SpringMVC有什么版本更新
为什么4.1.1没有问题,4.3.10会有问题,毕竟项目采用的跨域解决方案是比较通用(W3C标准 )的,没有涉及框架层面。
通过查看SpringMVC官方文档,从4.2.0版本开始,SpringMVC开始支持CORS跨域解决方案,主要表现是通过简单的配置,就可以支持CORS,从后面源码分析,可以看到本质还是对Response添加头文件。
https://docs.spring.io/spring/docs/4.2.0.RELEASE/spring-framework-reference/html
可以看到最快的方式实现CORS,通过xml配置
<mvc:cors>
    <mvc:mapping path="/**" />
</mvc:cors>
把项目代码原先的跨域方式改成,框架提供的方案。(去掉原先的过滤器)
再一次测试发现,并没有解决问题,还是和原先的效果是一样的。说明通过配置xml的实现和原先的实现几乎是一样的。继续排查问题。
可以看到跨域预处理请求返回状态码是302,考虑到几点:3xx一般是权限问题导致、跨域预处理请求头参数不会携带参数。所以联想到Login的拦截器,通过Debug打断点的方式,确实options请求走到了拦截器里面,那也就基本确认是因为拦截器校验失败,导致的跨域预处理请求失败。后面验证了之前4.1.1的校验过程,看到options请求并没有走到Login的拦截器。
通过上面的排查,也就有了后面的问题和源码解读。
为什么4.1.1和4.3.10的options请求拦截器处理不一样。
4.2.0以上版本Spring
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值