16

私のWebアプリは、ユーザーがサーバーにログインしたときに、次のように応答にSet-Cookieヘッダーを追加するように作成されています。

Set-Cookie:JSESSIONID=1; Path=/myApp/; Secure

ログアウト時に、クライアント(ブラウザ)でこのCookieを削除しようとします。これは、Cookieが削除されている限り、サーバーでセッションが正常に破棄されたかどうかは関係ないためです。残っている「ゴースト」セッションは、サーバー上で時々クリーンアップされます。

しかし、私のアプリはJSESSIONIDCookieを削除できません。ログアウト関数がから呼び出され、https://test.myserver.com/myApp/app/index.html#/mySubPageログアウト関数が実行するとします。

delete $cookies["JSESSIONID"];
$location.path("/login");

クッキーは削除されません。Chromeデベロッパーツールの[リソース]タブにあるCookieの一覧を更新すると、Cookieがまだ残っていることがわかります。ログインページをリロードし、[リソース]タブのCookieリストを更新すると、Cookieが引き続き表示されます。

HTTPOnly CookieではないのにJavascriptクライアントからCookieを削除できないのはなぜですか?問題を引き起こしているのはパスですか?スクリプトはCookieのパスに含まれるページで実行されているため、そうではありません。クッキーは普通に扱うのはそれほど難しいことではないので、私がここで見落としている些細なことがあるかもしれないことを私はよく知っています-しかしどんな助けでも大いに感謝されます。

アップデート:

元の投稿でアプリに間違ったパスを指定していました。これで、正しいパスを反映するように編集されました(まあ、抽象的に)。これは質問にとって重要な情報であることがわかりました。AngularJSは、作成/削除するすべてのCookieのパス属性としてアプリの完全な相対パスを使用します。サーバーがCookieをのパスで設定し/myApp/、アプリがの相対パスで実行されていたため/myApp/app、Angularは前者を削除しようとしました。存在しないCookie(既存のCookieを上書きまたは削除するには、名前、ドメイン、およびパスがすべて、Cookieの作成時に使用されたものと同じである必要があります)。

4

3 に答える 3

11

サーバーからの応答を確認する必要があると思います-おそらく、Cookieの値を設定する「set cookie」ヘッダーフィールドが含まれています。

Cookie の値を追加/変更/削除/監視する方法を示すPlunker の例を次に示します (ただし、Cookie の値を変更できるサーバー側の応答はありません)。

しかし、一般的に、$cookies オブジェクトは一種の「プロキシ オブジェクト」であり、AngularJS ngCookies モジュールによって双方向で追跡され、ブラウザの Cookie が変更されたときにフィールドを変更します (変更を $watch できます)。ブラウザの実際の Cookie であるため、このオブジェクトを変更できます。

したがって、Cookie を削除できない唯一の理由は、ブラウザで Cookie を削除し、サーバーが Cookie を再度設定し、ページをリロードした後も Cookie が残っていることです。

于 2013-01-07T16:13:09.750 に答える
3

更新で提供した答えは正しいようです。Angular$cookieStoreは、パス値が現在のパスと同じである Cookie でのみ機能します。

それをだます方法は、この問題で ajspera によって提供されたソリューションを使用することです。

<head>
  <base href="/">
</head>

HTML の head 要素に追加<base href="/">するだけで、その時点で機能します。

別の解決策は、Cookie を送信したサーバーを使用して Cookie のパスを設定することです。次のようなNode.js Expressでは

res.cookie('specialCookie', 'special!', {path: '/myApp'});

私にとっては、 $cookieStore が末尾のスラッシュを取り除くように見えるので、両方の方法で試す必要があるかもしれません.

于 2014-08-18T22:34:24.253 に答える