1. 什么是CORS?
CORS 全称是跨域资源共享(Cross-Origin Resource Sharing),是一种 AJAX 跨域请求资源的方式,支持现代浏览器,IE支持10以上。
2. 什么情况会出现CORS?
各位前端大大应该都听后端同学说过这么一句话吧:我用postman请求是正常的啊。
所以,什么情况下会出现CORS呢?
那就必须要讲到一个大家常听的名词了:同源
2.1 什么是同源呢?
我们的URL由:协议(如:http/https)、域名(如:baidu.com)、端口(如:8080)、请求的路径和参数组成,如果两个URL的协议、域名和端口相同,则表示它们同源。
2.2 不同源有什么限制呢?
不同源对js有以下几点限制:
- 无法用js读取非同源的Cookie、SessionStorage、LocalStorage、Cache、Indexed DB等
- 无法用js获取非同源的DOM 。
- js向非同源的服务器发请求,但是服务器返回的数据会被浏览器拦截
2.3 同源策略是由谁来执行的呢?
同源策略是由浏览器来执行。所有的限制都是浏览器的作用。这是浏览器为了保护用户的数据安全而采取的策略。
到这大家就能理解为什么我们网页发起请求,显示CORS了,而后端用postman测试,能正常访问了吧。
接下来我们来讲讲,怎么解决CORS问题。
3. CORS问题解决方案
通常CORS的问题可以由前端解决也可以由后端解决。那我们分别讲讲,前后端应该怎么解决CORS的问题吧。
3.1 前端解决CORS问题的常用方法
- JSONP跨域
JSONP跨域:原理就是利用
<script>标签没有跨域限制,通过<script>标签src属性,发送带有callback参数的GET请求,服务端将接口返回数据拼凑到callback函数中,返回给浏览器,浏览器解析执行,从而前端拿到callback函数返回的数据。 - 配置代理 以vue为例,在vue的config.js文件中设置代理对象。
proxy: {
'/api': {
target: '', // 接口域名
changeOrigin: true, //是否跨域
pathRewrite: {
'^/api': '/' // 凡是/api开头的地址都可以跨域
}
}
}
3.2 后端解决CORS问题方法
配置access-control-allow-origin:*
后端配置了access-control-allow-origin:* ,前端请求仍然提示跨域,应该如何排查问题?
postman检查方法: response的header是否包含Access-Control-Allow-Origin: *
- 如果不包含: 检查 lambda return 的header中是否有包含 access-control-allow-origin:*
- 如果包含:检查api getway的设定中,是否有包含 access-control-allow-origin:*
补充:如果前端需要传header数据,但是后端不需要验证。应该怎么设置呢?
后端部署的集成响应中需要把 Access-Control-Allow-Headers 上加上对应的数据,或者设置成 Access-Control-Allow-Headers:*
比如前端的header中有token,后端不需要验证,但后端设定Access-Control-Allow-Headers不是*,也不包含header,此时前端请求就会提示,header中不允许出现token。
本文主要是为记录后端设置了access-control-allow-origin:* ,联调中出现CORS问题,我们常用的排查方法,以及解决方案。如有不对之处,请不吝指出~