问题描述
在使用ajax请求其他平台时进行登录处理,cookie携带时失效。(使用PHP与Jquery作为演示)
例如,当我的域名 www.example.com
调用Ajax访问 api.exmaple.com
时进行登录操作,这个时候api.example.con
的响应中肯定会有一条类似为Set-Cookie: PHPSESSID=6ut2plej880p83ja9f76doue1i; path=/
但是当页面刷新后,重新去访问api.example.com
时你会发现这个session已经失效了。
问题原因
由于一般的现代浏览器均遵从跨域请求
规范,即Access-Control-Allow-Origin
和Access-Control-Allow-Credentials
。前者的作用为,允许指定域名跨域请求,后者作用为是否允许请求时携带验证信息(即Cookie等其他信息)
具体可参考
https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Headers/Access-Control-Allow-Origin
https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Headers/Access-Control-Allow-Credentials
解决方案
对于服务端需要添加两个header(Access-Control-Allow-Origin与Access-Control-Allow-Credentials),同时注意Access-Control-Allow-Origin必须指定单个域名,不能为通配符*,Access-Control-Allow-Credentials为true。 对于Ajax请求端,可以直接设置ajax的全局属性
代码语言:javascript复制$.ajaxSetup({xhrFields: { //全局设置AJAX携带COOKIE
withCredentials: true
}});