SpringBoot处理CORS问题
1.什么是CORS
Cross-origin resource sharing,缩写:CORS ,
俗称:跨域资源共享,
表现症状:Access to XMLHttpRequest at ‘http://172.21.202.120:8080/chart’ from origin ‘http://localhost:8080’ has been blocked by CORS policy: No ‘Access-Control-Allow-Origin’ header is present on the requested resource.
是一种用于让网页的受限资源能够被其他域名的页面访问的一种机制。说白了CORS就是一种桥接机制,用作网页间的受限资源访问。网页资源为啥会受限呢?是因为浏览器的同源策略,众所周知http是无状态协议,是不安全的。浏览器为了保证安全性,阻隔恶意文档,减少可能被攻击的媒介。于是便设计了同源策略,用于限制一个源的文档或者它加载的脚本如何能与另一个源的资源进行交互。 例如,XMLHttpRequest和Fetch API遵循同源策略。 这意味着使用这些API的Web应用程序只能从加载应用程序的同一个域请求HTTP资源,除非响应报文包含了正确CORS响应头。就像这样:
一个源(Origin)包含了协议,地址,端口源组 就像这样一个源http://eqxiu.chart.com/dir/page.html
这里举一些与这个源,同源或非同源的例子如下:
URL | 结果 | 原因 |
---|---|---|
http://eqxiu.chart.com/dir2/other.html | 同源 | 只有路径不同 |
http://eqxiu.chart.com/dir/inner/another.html | 同源 | 只有路径不同 |
https://eqxiu.chart.com/secure.html | 不同源 | 协议不同 |
http://eqxiu.chart.com:81/dir/etc.html | 不同源 | 端口不同,默认端口是80 |
http://other.company.com/dir/other.html | 不同源 | 主机不同 |
问题和原因都找到了,现在就该回到具体业务场景来解决问题了,思路基本就是在response头中加入CORS允许的控制。参考Spring的官方文档有如下两种解决方案:https://spring.io/guides/gs/rest-service-cors/#global-cors-configuration
2.SpringBoot处理CORS的方式
2.1 @CrossOrigin注解的方式
这种方式粒度更小:对需要跨域请求的接口@RequestMapping前加上一个@CrossOrigin解并配置参数即可,就像这样@CrossOrigin(origins = “http://