公司要推广产品,找了一个平台投放广告。正式投放之前平台商要求对接他们的API埋点接口,在对接的过程中碰到的一些问题做个记录。
要解决跨域问题,首先先明白浏览器为什么会产生跨域。
当一个资源从与该资源本身所在的服务器不同的域、协议或端口请求一个资源时,资源会发起一个跨域 HTTP 请求。
第一次请求尝试碰到下面报错信息
这张图是对接的后端开发截取他的配置信息
原因是:我们前端设置了 axios.defaults.withCredentials = true
; 而后端在请求响应头上加了 Access-Control-Allow-Origin: *
。
为什么这样设置就出问题了呢?
我们先来了解一下 withCredentials 的作用
withCredentials 属性是一个Boolean类型,它指示了是否该使用类似cookies,authorization headers(头部授权)或者TLS客户端证书这一类资格证书来创建一个跨站点访问控制(cross-site Access-Control)请求。在同一个站点下使用withCredentials属性是无效的。
说白了就是:当前请求为跨域类型时是否在请求中协带cookie。
到了这里基本上就明白了,如果要发送Cookie,Access-Control-Allow-Origin就不能设为星号,必须指定明确的、与请求网页一致的域名。同时,Cookie依然遵循同源政策,只有用服务器域名设置的Cookie才会上传,其他域名的Cookie并不会上传,且(跨源)原网页代码中的document.cookie也无法读取服务器域名下的Cookie。
我以外大功告成,试了一把,又红了…
原因是:我们在请求头部加了一个 Authorization
字段,而后端需要再响应头部Access-Control-Request-Headers
添加一下Authorization字段。
那这个Access-Control-Request-Headers
是干嘛用的呢?
- 响应首部 Access-Control-Allow-Headers 用于 preflight request (预检请求)中,列出了将会在正式请求的 Access-Control-Request-Headers 字段中出现的首部信息。
以上是一个简单的跨域资源共享 CORS处理方法常碰到的问题,cors 还有一个 “非简单请求”真实请求之前需要先从客户端向服务器端发一个预检请求,感兴趣的可以自行Google。
改完之后再试一下,终于大功告成。泪流满面…全程都是这边在推动向前进,外部API对接的后端有点不太给力哦。😯