记一次跨域问题
springboot
项目,后台已经配置好允许跨域,但前台仍是报跨域问题无法通过,追踪源码+debug发现原因,这里记录一下。
案发场景:
- springboot项目。
- 已重写
WebMvcConfigurationSupport
的addCorsMappings(CorsRegistry registry)
方法,并添加了允许跨域的逻辑。 - 跨域的原因是在http协议下发送https请求,引起的跨域。
找到原因:
查看日志,发现springboot
的 DefaultCorsProcessor
这个类对此请求的判断为同源的,没有做处理,就直接放行了。
明明浏览器发出请求是https,而页面是http为什么框架会判断成同源的呢???
据此联想到出,是因为页面是http
的,发送https
的请求,浏览器判断是跨域的所以添加了origin
头表明请求页面的源地址。
然而请求到达nginx
后,nginx
验证https
证书等处理后,使用http
协议再次将请求发送给tomcat
,后台收到的请求实际上是nginx
使用http
协议发送的请求。
然后框架处理跨域时发现请求中的origin
和host
同是http请求不存在跨域问题,也就不做跨域处理。结果返回到浏览器后,浏览器发现没有跨域的响应头,屏蔽掉了结果,导致浏览器报跨域错误。
记一次跨域问题
https://www.huangchaoyu.com/736025888.html