阻止在AJAX请求中发送Cookies

43

我有一个Web服务,我从脚本中调用它,但不需要在Cookie中存储任何信息。每次请求该服务时,都会将Cookie与其一起发送。我知道默认情况下会随HTTP请求发送Cookie,但是否有任何方法可以覆盖该行为并不发送Cookie?

简而言之,我是这样发出请求的:

$.ajax({
    type: "POST",
    cache: false,
    url: url,
    data: data,
    contentType: "application/json; charset=utf-8",
    dataType: "json",
    success: function(response) { successFunc(response); },
    error: function(xhr) { errorFunc(xhr); }
});
5个回答

18
将 AJAX 请求发送到您服务器上没有 cookie 的子域。因此,您的应用程序是 www.mydomain.com,而 Ajax 请求是从 api.mydomain.com 提供的,您从未在其中设置 cookie。对于静态文件(如图像等),这也是一个很好的想法...请参阅http://developer.yahoo.com/performance/rules.html中的“为组件使用无 cookie 域”部分。

Osseta,关于无cookie域名的建议非常好。我们目前已经对其他资源(如几乎所有静态文件)采用了这种方式。我需要更详细地说明一下这个Web服务。它不是独立的,而是包含在一个子目录中。因此,在本讨论中,假设我正在调用与我的Web应用程序位于同一域下但在子路径“/publicservices/service.asmx”中的方法。 - Simon
我并不确定,但我认为Cookie是针对(子)域的全局配置。因此,它们要么开启要么关闭,并且不能在每个请求的基础上进行配置。 - Osseta
很不幸,我确实认为你是对的。非常感谢你的见解! - Simon
不要忘记,如果您不使用主域名 - example.com(没有www),则可能只能使用此方法。我个人不喜欢www,因此我使用主域名,但是由于所有子域名的Cookie都包括在主域名中,所以这种方法对我无效。 - Movahhedi

8
另一种方法是在执行$.ajax之前:
1. 使用JavaScript从浏览器中获取您域的cookie(将其保存在全局变量中)
2. 使用JavaScript从浏览器中删除您域的cookie
3. 执行$.ajax调用
4. 将cookie(来自全局变量)放回浏览器中。

如果您根本不需要来自您域的cookie,请直接删除它们(因此跳过步骤1和4)。


2
几乎完美...因为没有办法恢复曾经存在的cookie的寿命。 - Beto Aveiga
如何在不使用任何 cookie 或删除它的情况下发出请求。 - nim

4

1
你如何将这个与那个调和起来?在同站点请求中,设置withCredentials没有任何效果。虽然在我七年前的问题中并不明显,但是这个.NET服务被嵌入到网站中(在站点中嵌套的文件夹中的.asmx服务)。 - Simon
1
好的,我会明确指出withCredentials=false仅防止在跨域请求中发送cookie。 - Mustafa Alammar
1
请注意,如果您正在查看Chrome/Firefox扩展程序的上下文中的此答案,则我认为withCredentials在那里被忽略了。 - mlissner

0

你说得对,浏览器会在HTTP请求中发送匹配的(路径+域名+会话)cookie,这对于cookie机制的工作至关重要。

你能不能简单地不读取这些cookie呢?

此外,当最初设置cookie时,您可以设置哪个目录(及其子目录)可以访问cookie。

例如,如果您将cookie设置为仅在/foo/bar/中读取,则位于/whatever/ajaxHandler.php的文件无法查看这些cookie。

看看这个链接:http://us.php.net/setcookie

虽然我不确定你是否使用PHP,但它可能是一个很好的起点。


5
忽略这个cookie并不能解决它消耗带宽的问题。 - Osseta
1
Foxtrot,我很好奇你所说的“仅仅不读取cookie”是什么意思。 此外,关于您设置特定目录的角度,是否可以在整个范围内设置cookie,但排除某个目录? 如果是这样,我认为这会给我提供一个解决方案。请记住,所有这些都发生在同一个域中,并且需要通过该域中的路径进行区分。 我不确定cookie能否处理这个问题。有人知道jQuery本身是否允许在AJAX请求中不发送cookie吗?那对我来说将是最终解决方案。=] - Simon
1
有时我们并没有不读取cookie的选择,例如当授权是通过框架中的cookie处理,在视图代码运行之前。 - djangonaut

0

不,cookie将始终被发送。

您可以控制如何将您的cookie发送到浏览器,并在它们上使用http标志,这意味着它们不会通过JavaScript发送。

或者(许多网站都在使用的方法),创建一个从未发送任何cookie的新子域名。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接