簡體   English   中英

無法從 JS 中的 document.cookie 訪問 cookie,但瀏覽器顯示 cookie 存在

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

我無法從 JavaScript 訪問任何 cookie。 我需要讀取一些值並通過 JSON 發送它們以進行我的自定義檢查。

我嘗試從 JS 訪問 cookie,就像在以下位置描述的那樣:

正如您在代碼中看到的那樣,接下來它看起來像水晶一樣清晰:

var c_value = document.cookie;

當我嘗試從 Chrome 的網絡調試器訪問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'));

我會說 http only 是您的第一個罪魁禍首,但這也可能通過不設置 cookie 的范圍而發生。

如果該站點已從另一個域重定向,則您需要考慮設置 cookie 的范圍。 Domain 和 Path 定義了 cookie 的范圍,cookie 應該發送到哪些 URL。 根據這一點,您可能不會在響應中看到 cookie。

我在成功的 SAML SSO 登錄上設置 cookie 時遇到了這個問題,但無法從文檔中檢索 cookie,因為它從未作為請求的一部分發送。

還要注意 cookie 的 Path 屬性,因為 cookie 只對 Path 下的子目錄可見。 我有你的問題,我解決了設置路徑“/”

我多次遇到同樣的問題。 而每一次,都是出於不同的原因。

不同的原因:

  • httpOnly字段的問題。 它被設置為false ,我試圖從控制台訪問它。 將它設置為true或從源代碼訪問它就可以了。
  • secure域的問題。 這是true ,我只使用了 http。
  • Expires / Max-Age cookie 已過時並且在document.cookie中不可見。

如果您的 cookie 設置為Set-CookieSet-Cookie2則它不是響應標頭集合的一部分: http : //www.w3.org/TR/XMLHttpRequest/#the-getallresponseheaders%28%29-method

返回響應中的所有標頭,但字段名稱為 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並允許你做一些操作。

可以在服務器端進行更改。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM