84

我无法从 JavaScript 访问任何 cookie。我需要读取一些值并通过 JSON 发送它们以进行自定义检查。

我试图从 JS 访问 cookie,就像它在以下描述的那样:

正如您在代码中看到的那样,它在下一个看起来像水晶一样清晰:

var c_value = document.cookie;

当我尝试从 Chrome 的 web 调试器访问值时,我在Watch 表达式document.cookie中只看到空字符串:

所以我无法读取我需要的 cookie 值。

我检查了 cookie 名称,我发送该名称以获取关联值是正确的。另外,如果您有兴趣,我正在使用W3Schools源代码来获取 cookie(但从第二个链接来看,该技术是相似的)。

如何解决我的问题?

4

6 回答 6

143

您很可能正在处理httponlycookie。httponly是您可以在 cookie 上设置的标志,表示 JavaScript 无法访问它们。这是为了防止恶意脚本窃取带有敏感数据甚至整个会话的 cookie。

因此,您要么必须禁用该httponly标志,要么需要找到另一种方法将数据获取到您的 javascript。

通过查看您的代码,应该很容易禁用 http only 标志:

Response.AddHeader("Set-Cookie", "CookieName=CookieValue; path=/;");
Response.SetCookie(new HttpCookie("session-id") { Value = Guid.NewGuid().ToString(), HttpOnly = false });
Response.SetCookie(new HttpCookie("user-name") { Value = data.Login, HttpOnly = false });

现在您应该能够从 JavaScript 访问 cookie 信息。但是我不确切知道您要获取什么样的数据,所以也许您可以采用另一种方法,例如使用您需要的信息在页面上呈现一些数据属性,而不是尝试读取 cookie:

<div id="example" data-info="whatever data you are trying to retrieve"></div>

console.log(document.getElementById('example').getAttribute('data-info'));
于 2013-07-07T00:40:47.417 回答
3

我会说 http only 是您的第一个罪魁祸首,但这也可能通过不设置 cookie 的范围而发生。

如果该站点已从另一个域重定向,您将需要考虑设置 cookie 的范围。Domain 和 Path 定义了 cookie 的范围,cookie 应该被发送到哪些 URL。取决于此,您可能不会在响应中看到 cookie。

我在成功的 SAML SSO 登录设置 cookie 时遇到了这个问题,并且无法从 Document 中检索 cookie,因为它从未作为请求的一部分发送。

于 2017-11-10T17:35:33.033 回答
3

还要注意 cookie 的 Path 属性,因为 cookie 仅对 Path 下的子目录可见。我有你的问题,我解决了设置路径“/”

于 2017-12-07T10:24:50.793 回答
2

我有几次同样的问题。而且每次都是出于不同的原因。

不同的原因:

  • 场的问题httpOnly。它设置为false,我试图从控制台访问它。将它设置为true或从源代码访问它就可以了。
  • 场的问题secure。它是true,我只使用http。
  • 的问题Expires / Max-Age。cookie 已过时,在document.cookie.
于 2020-07-16T18:03:44.723 回答
0

如果您的 cookie 设置为Set-CookieSet-Cookie2不是响应标头集合的一部分:http: //www.w3.org/TR/XMLHttpRequest/#the-getallresponseheaders%28%29-method

返回响应中的所有标头,但字段名称为 Set-Cookie 或 Set-Cookie2 的标头除外。

于 2014-01-07T09:38:17.490 回答
0

如果您使用某种安全身份验证,那么由于安全原因,您无法直接访问 cookie。您必须使用以下代码更改服务器端的一些响应属性。

Response.AddHeader("Set-Cookie", "CookieName=CookieValue; path=/;");
Response.SetCookie(new HttpCookie("session-id") { Value = Guid.NewGuid().ToString(), HttpOnly = false });
Response.SetCookie(new HttpCookie("user-name") { Value = data.Login, HttpOnly = false });

但是你不应该因为它可能会改变安全到不安全,所以你必须找出在服务器端完成的解决方案来删除cookie并允许你做一些操作。

它可以在服务器端进行更改。

于 2018-07-04T12:00:23.993 回答