记一次跨域问题

Posted by hcy on January 19, 2020

springboot项目,后台已经配置好允许跨域,但前台仍是报跨域问题无法通过,追踪源码+debug发现原因,这里记录一下。

案发场景:

  1. springboot项目。
  2. 已重写WebMvcConfigurationSupportaddCorsMappings(CorsRegistry registry) 方法,并添加了允许跨域的逻辑。
  3. 跨域的原因是在http协议下发送https请求,引起的跨域。

找到原因:

查看日志,发现springbootDefaultCorsProcessor 这个类对此请求的判断为同源的,没有做处理,就直接放行了。

明明浏览器发出请求是https,而页面是http为什么框架会判断成同源的呢???

据此联想到出,是因为页面是http的,发送https的请求,浏览器判断是跨域的所以添加了origin头表明请求页面的源地址。

然而请求到达nginx后,nginx验证https证书等处理后,使用http协议再次将请求发送给tomcat,后台收到的请求实际上是nginx使用http协议发送的请求。

然后框架处理跨域时发现请求中的originhost同是http请求不存在跨域问题,也就不做跨域处理。结果返回到浏览器后,浏览器发现没有跨域的响应头,屏蔽掉了结果,导致浏览器报跨域错误。


转载请注明出处:https://www.huangchaoyu.com/2020/01/19/记一次跨域问题/