如何使用 AJAX 请求设置 cookie 值?

Posted

技术标签:

【中文标题】如何使用 AJAX 请求设置 cookie 值?【英文标题】:How to set cookie value with AJAX request? 【发布时间】:2021-12-28 23:34:16 【问题描述】:

我想在 AJAX 请求上设置一个 cookie 值,但下面的代码不起作用。

$.ajax(
    type: "GET",    
    url: "http://example.com",
    cache: false,
    setCookies: "lkfh89asdhjahska7al446dfg5kgfbfgdhfdbfgcvbcbc dfskljvdfhpl",
    crossDomain: true,
    dataType: 'json',
    success: function (data) 
        alert(data);
    );

如何在标头中设置 cookie?

【问题讨论】:

设置中根本没有setCookies选项。 你想做什么..? 你应该在javascript中设置cookie,然后发送请求。标头将包含您在 ajax 请求中的 cookie。使用这些函数在 JS 中设置和获取 cookie:w3schools.com/js/js_cookies.asp 【参考方案1】:

基本上,ajax 请求以及同步请求会自动发送您的文档 cookie。因此,您需要将 cookie 设置为文档,而不是请求。但是,您的请求是跨域的,事情变得更加复杂。基于this answer,另外设置文档cookie,你应该允许它发送到跨域环境:

type: "GET",    
url: "http://example.com",
cache: false,
// NO setCookies option available, set cookie to document
//setCookies: "lkfh89asdhjahska7al446dfg5kgfbfgdhfdbfgcvbcbc dfskljvdfhpl",
crossDomain: true,
dataType: 'json',
xhrFields: 
    withCredentials: true
,
success: function (data) 
    alert(data);
);

【讨论】:

如果我想在某种程度上伪造一个 cookie 并在不设置的情况下发送它呢?毕竟,cookie 只是一个标题,来吧! :) @TomášZato 根据XHR specs 你不能这样做。 (见第 5 点 Terminate these steps if header is a case-insensitive match ... Cookie ... The above headers are controlled by the user agent to let it control those aspects of transport. This guarantees data integrity to some extent.)。我相信你仍然可以伪造一个cookie在请求之前设置它并在complete回调中删除。我相信这是我们在浏览器中能做的最多的事情。 其实我只是提醒自己javascript是单线程的,所以设置cookie然后删除它不会对其他脚本产生负面影响。

以上是关于如何使用 AJAX 请求设置 cookie 值?的主要内容,如果未能解决你的问题,请参考以下文章

HttpOnly cookie 如何处理 AJAX 请求?

js如何设置http头部

为啥 AJAX 请求返回后浏览器不设置 cookie?

Ajax跨域请求携带cookie问题

Django 设置 cookie 中的 csrftoken

Django设置cookie中的csrftoken