可以'无法在JS中访问document.cookie中的cookie,但浏览器显示存在cookie

Can't access cookies from document.cookie in JS, but browser shows cookies exist

本文关键字:cookie 中的 document 存在 显示 浏览器 访问 JS 可以      更新时间:2023-09-26

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

我尝试过从JS访问cookie,就像在中描述的那样

  • http://www.w3schools.com/js/js_cookies.asp
  • 按名称获取cookie

正如你在代码中看到的那样,它就像水晶一样清晰——下一个:

var c_value = document.cookie;

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

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

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

如何解决我的问题?

您很可能正在处理httponly cookie。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'));

还要注意cookie的Path属性,因为cookie只对Path下的子目录可见。我遇到了你的问题,我解决了设置Path"/"

我多次遇到同样的问题。每一次,都是出于不同的原因。

不同原因:

  • CCD_ 5字段的问题。它被设置为false,我正试图从控制台访问它。将它设置为true或从源代码中访问它就成功了
  • CCD_ 8字段的问题。它是true,而我只使用http
  • CCD_ 10的问题。cookie已过期,在document.cookie中不可见

我认为http只是第一个罪魁祸首,但如果不设置cookie的范围,也可能会发生这种情况。

如果网站已从另一个域重定向,则需要考虑设置cookie的范围。域和路径定义cookie的作用域,cookie应发送到哪些URL。根据这一点,您可能在响应中看不到cookie。

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

如果您的cookie设置为Set-CookieSet-Cookie2,则它不属于响应标头集合:http://www.w3.org/TR/XMLHttpRequest/#the-getallresponseheaders%28%29方法

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

如果您使用某种安全身份验证,那么在这种情况下,由于安全原因,您无法直接访问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的解决方案,并允许你做一些操作。

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