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

时间:2013-07-06 23:35:36

标签: javascript cookies get document key-value

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

我试图从JS访问cookie,如下所述:

正如你在代码中看到的那样,它被视为下一个水晶:

var c_value = document.cookie;

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

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

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

如何解决我的问题?

谢谢!

6 个答案:

答案 0 :(得分:109)

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

所以你要么必须禁用httponly标志,要么你需要找到另一种方法来获取你的javascript数据。

通过查看代码,可以很容易地禁用仅http标志:

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'));

答案 1 :(得分:2)

我会说http只是你的第一个罪魁祸首,但这也可以通过不设置你的cookie的范围来实现。

如果站点已从其他域重定向,则需要考虑设置cookie的范围。 Domain和Path定义cookie的范围,cookie应发送到哪些URL。根据此情况,您可能无法在回复中看到Cookie。

我在成功进行SAML SSO登录时设置Cookie并且无法从文档中检索Cookie时遇到此问题,因为它从未作为请求的一部分发送。

答案 2 :(得分:2)

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

答案 3 :(得分:1)

我有几次相同的问题。而且每次都是因为不同的原因。

不同的原因:

    httpOnly字段的
  • 问题。它设置为false,而我试图从控制台访问它。将其设置为true或从源代码访问即可达到目的。
  • secure字段的
  • 问题。是true,我只用http。
  • Expires / Max-Age的问题。 Cookie已过时,在document.cookie中不可见。

答案 4 :(得分:0)

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

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

答案 5 :(得分: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”){值= data.Login,HttpOnly = false});

但是您不应该这样做,因为它可能会从安全更改为不安全,因此您必须找出在服务器端执行的解决方案以删除Cookie,并允许您执行一些操作。

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