web-dev-qa-db-ja.com

JSのdocument.cookieからCookieにアクセスできませんが、ブラウザーはCookieが存在することを示します

JavaScriptからCookieにアクセスできません。カスタムチェックのために、値を読み取ってJSON経由で送信する必要があります。

JSからCookieにアクセスしようとしました。

コードでわかるように、次のクリスタルのように明確に見えます:

var c_value = document.cookie;

ChromeのWebデバッガーからdocument.cookie値にアクセスしようとすると、Watch式で空の文字列のみが表示されます

したがって、必要なcookieの値を読み取ることができません。

関連する値を取得するために送信しているCookie名を確認しましたIS正しい。また、W3Schoolsを使用しています興味がある場合は、Cookieを取得するためのソースコード(ただし、2番目のリンクからのテクニックは似ています)。

どうすれば問題を修正できますか?

ありがとう!

66
user2402179

ほとんどの場合、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'));
110
PeeHaa

cookieはPathの下のサブディレクトリにのみ表示されるため、CookieのPath属性にも注意してください。あなたの問題があり、パス「/」の設定を解決しました

2
ejaenv

私はhttpだけがあなたの最初の犯人であると言いますが、これはあなたのクッキーの範囲を設定しないことによって起こることもあります.

サイトが別のドメインからリダイレクトされている場合は、Cookieのスコープを設定する必要があります。ドメインとパスは、Cookieのスコープ、Cookieの送信先URLを定義します。これによっては、応答にCookieが表示されない場合があります。

成功したSAML SSOログインでCookieを設定するときにこの問題に遭遇し、リクエストの一部として送信されなかったため、ドキュメントからCookieを取得できませんでした。

2
Tenzin Palber

CookieがSet-CookieまたはSet-Cookie2として設定されている場合、それは応答ヘッダーコレクションの一部ではありません。 http://www.w3.org/TR/XMLHttpRequest/#the-getallresponseheaders%28 %29-method

フィールド名がSet-CookieまたはSet-Cookie2であるものを除き、応答からすべてのヘッダーを返します。

0
Dunken

何らかの安全な認証を使用している場合、その場合は安全のため直接クッキーにアクセスできません。以下のコードを使用して、サーバー側の応答属性を変更する必要があります。

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

ただし、セキュアから非セキュアに変更される可能性があるため、そうすべきではありません。そのため、Cookieを削除していくつかの操作を実行できるようにするためにサーバー側で行う解決策を見つける必要があります。

サーバー側で変更を行うことができます。

0
Manas