jquery - 即使响应包含 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 );
}
});
}
收到的响应标头:
访问控制允许凭据:true
Access-Control-Allow-Headers:X-Requested-With,accept,content-type,Cookie
访问控制允许方法:POST、GET、PUT、OPTIONS、DELETE
访问控制允许来源:http ://myapp2.com:7011
访问控制最大年龄:3600
内容编码:gzip
内容类型:文本/纯文本;字符集=ISO-8859-1
日期:格林威治标准时间 2018 年 6 月 6 日星期三 15:10:09
服务器:Apache-Coyote/1.1
设置 Cookie:MYCOOKIE=62lml5_S7qS31KaFDg-SH-e8Ds5FPjljCIHzfmhxMAr8Fdrqr6fHLjI7s2XPAO2P3tNFLNLS1_fgvDXF4pLmfg#1s1S1#normal-false;路径=/; HttpOnly
传输编码:分块
变化:接受编码
有凭据:真
当浏览器点击相同的 url 时,我可以看到存储在浏览器中的 cookie,但在 ajax 请求的情况下,它不会被存储。因此无法发送除此 cookie 之外的后续请求。
解决方案
您withCredentials: true
作为 HTTP 标头发送,这没有任何用处。您应该将其设置为XHR 字段。在 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 设置。相反,它似乎是jQuery 的Fetch API等价物withCredentials: true
。无论如何,它在这里是没有用的。crossDomain
也不是 HTTP 标头。它可以用作 jQuery AJAX 设置(即在对象之外headers
)以强制 jQuery 将请求视为跨域,即使目标 URL 看起来与当前页面的域匹配。在你的情况下,它也是没用的。HTTP标
X-Requested-With: XMLHttpRequest
头由 jQuery 自动添加,因此将其指定为自定义标头是 100% 多余的。不需要显式发送 HTTP
Content-Type
标头,因为 jQuery 会自动生成一个。如果您希望指定 jQuery 应该为请求使用哪种内容类型,您应该使用contentType
设置outsideheaders
。在任何情况下,您指定的都是默认值。Accepts
同样,您应该使用 jQuery$.ajax()
设置accepts
和/或dataType
控制 jQuery 将在响应中接受哪些内容类型,而不是发送自定义 HTTP标头。通常您不需要这样做,因为 jQuery 使用的默认值很好,除非您的服务器配置错误并发送错误的内容类型。
推荐阅读
- java - Java 15 - 向我的画布添加可自定义文本会产生缩放/位置问题
- python - 从单个图像中获取多个图像裁剪
- python - 为什么不是'print (getResults(test_data,getNaiveAnswer))',即这段代码的最后一行没有给出预期的输出作为数据帧?
- ruby-on-rails - 在 Ruby on Rails 中存储应用程序范围的缓存数据的位置
- reactjs - 从主机应用程序返回 404 未找到微前端依赖项
- python - 使用 SuperLink 时如何修复错误
- node.js - 如何在 moongose 和 moongodb 中查询此日期格式 "ticketTimeStartDate": "Mon Oct 18 2021 12:28:59 GMT+0000 (Coordinated Universal Time)",
- spring - 如何在java spring中的请求中添加用户名和密码
- c# - 如何在开始时在表格中设置分页的第 2 页
- php - 如何从大型 csv 文件创建非关联数组?