即使响应包含ajax请求的“Set-Cookie”标头,cookie也不会存储在浏览器中
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了即使响应包含ajax请求的“Set-Cookie”标头,cookie也不会存储在浏览器中相关的知识,希望对你有一定的参考价值。
即使响应包含ajax请求的“Set-Cookie”标头,cookie也不会存储在浏览器中。
请求代码:
function hitLogin(){
var loginUrl = "http://myapp:8080/login";
var geturl;
$.ajax({
type: "GET",
url : loginUrl,
data: {
user : "user1",
password : "encryptedPassword"
},
headers: {
"credentials": 'include',
"withCredentials" : true,
"crossDomain": true,
"X-Requested-With" : "XMLHttpRequest",
"Content-type" : "application/x-www-form-urlencoded",
"Accept":"text/plain",
},
success : function(data)
{
alert("Ajax request data: "+data);
},
error: function( xhr, status, error )
{
alert("Ajax request error: "+status );
}
});
}
收到回复标题:
访问控制允许的凭据:真
访问控制允许报头:X-要求,随着接受,内容类型,饼干
访问控制允许的方法:POST,GET,PUT,OPTIONS,DELETE
访问控制允许来源:http://myapp2.com:7011
访问控制 - 最大 - 年龄:3600
内容编码:gzip
内容类型:文本/无格式;字符集= ISO-8859-1
日期:2018年6月6日星期三格林尼治标准时间15:10:09
服务器:Apache-狼/ 1.1
设置Cookie:=的myCookie 62lml5_S7qS31KaFDg-SH-e8Ds5FPjljCIHzfmhxMAr8Fdrqr6fHLjI7s2XPAO2P3tNFLNLS1_fgvDXF4pLmfg#1s1S1#普通假;路径= /;仅Http
传输编码:分块
有所不同:接受编码
withCredentials:真
我可以看到存储在浏览器中的cookie,当浏览器发出相同的URL时,但是如果是ajax请求,则不会存储。因此无法发送除了此cookie之外的后续请求。
您发送withCredentials: true
作为HTTP标头,没有任何用处。你应该把它设置为XHR field。在jQuery中,你可以这样做:
$.ajax({
type: "GET",
url: loginUrl,
data: { /* request parameters here */ },
headers: { /* custom HTTP headers here, if you need any */ },
xhrFields: {
withCredentials: true,
},
/* other AJAX settings here */
})
此外,您发送的所有其他自定义HTTP标头实际上也是无用的:
credentials: include
既不是有效的HTTP标头,也不是XHR字段,也不是jQuery AJAX setting。相反,它似乎是jaz的Fetch API的withCredentials: true
等价物。无论如何,这里没用。crossDomain
也不是HTTP标头。它可以用作jQuery AJAX设置(即在headers
对象之外),以强制jQuery将请求视为跨域,即使目标URL看起来与当前页面的域匹配。在你的情况下,它也没用。X-Requested-With: XMLHttpRequest
HTTP标头由jQuery自动添加,因此将其指定为自定义标头是100%冗余。- 没有必要显式发送HTTP
Content-Type
头,因为jQuery将自动生成一个。如果你想指定jQuery应该为请求使用哪种内容类型,你应该使用contentType
之外的headers
设置。在任何情况下,您指定的是默认值。 - 同样,您应该使用jQuery
Accepts
设置$.ajax()
和/或accepts
来控制jQuery在响应中接受哪些内容类型,而不是发送自定义HTTPdataType
标头。通常你不需要,因为jQuery使用的默认值很好,除非你的服务器配置错误并发送错误的内容类型。
如上所述,这是CORS的情况,因此jquery请求无法设置cookie。
Set-Cookie on Browser with Ajax Request via CORS
帮助查找原因并能够使用XMLHttpRequest存储cookie,并将withCredentials设置为true
以上是关于即使响应包含ajax请求的“Set-Cookie”标头,cookie也不会存储在浏览器中的主要内容,如果未能解决你的问题,请参考以下文章
Spring 何时发回 XSRF-TOKEN set-cookie 响应标头?
JavaScript:set-cookie 和响应处理原子操作吗?
iOS 10.3 中的 ajax 响应中缺少 Set-Cookie 标头
使用请求模块,如何处理请求响应中的“set-cookie”?