本文作者: jsweibo
本文链接: https://jsweibo.github.io/2020/01/30/%E8%B7%A8%E6%BA%90%E8%AF%B7%E6%B1%82%E4%B8%AD%E7%9A%84cookie/
摘要
本文主要讲述了:
- 背景
- 解决方案
正文
背景
默认情况下,浏览器不会为 Ajax 跨源请求提供 cookie,也不会接受 Ajax 跨源请求中服务器端要求写入的 cookie
解决方案
要解决这个问题,必须满足以下所有条件:
- 网页表示允许 Ajax 跨源请求读写 cookie
- 服务器端表示愿意接受 Ajax 跨源请求中的 cookie。若此条件不满足,则浏览器会发出跨源请求,但不会把 Ajax 跨源请求的响应交给客户端的 JavaScript(会报错)
要做到第一点:
- 若使用
XMLHttpRequest
实例进行通信,则浏览器端需要将XMLHttpRequest
实例的withCredentials
设置为true
- 若使用
fetch()
进行通信,则浏览器端需要将init
对象的credentials
属性设置为include
要做到第二点:
- 若为简单请求,服务器端需要将
Access-Control-Allow-Credentials
设置为true
且Access-Control-Allow-Origin
的值必须是具体的源而不能为*
(请求头中包含认证信息) - 若为非简单请求,服务器端还需要将
OPTIONS
方法的Access-Control-Allow-Credentials
响应头设置为true
且Access-Control-Allow-Origin
的值必须是具体的源而不能为*
(请求头中包含认证信息)
示例:为 Ajax 跨源请求提供 cookie,接受 Ajax 跨源请求中服务器端要求写入的 cookie
nginx.conf
1 | server { |
使用XMLHttpRequest
实例:
a.example.com/js/index.js
1 | let xhr = new XMLHttpRequest(); |
使用fetch()
:
a.example.com/js/index.js
1 | fetch('http://b.example.com/data.json', { |
参考资料
本文作者: jsweibo
本文链接: https://jsweibo.github.io/2020/01/30/%E8%B7%A8%E6%BA%90%E8%AF%B7%E6%B1%82%E4%B8%AD%E7%9A%84cookie/
本文对你有帮助?请支持我
- 本文链接: https://jsweibo.github.io/2020/01/30/%E8%B7%A8%E6%BA%90%E8%AF%B7%E6%B1%82%E4%B8%AD%E7%9A%84cookie/
- 版权声明: 除非另有说明,否则本网站上的内容根据署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0) 进行许可。