CORS小整理

490 阅读3分钟

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问题,我们常用的排查方法,以及解决方案。如有不对之处,请不吝指出~