16

jQuery.ajaxを使用して別のホストへのリクエストを実行するWebアプリケーションがあります(「localhost」の異なるポートを使用しているため、現在は実際には同じです)。その後、サーバーは Cookie を返します。

Chrome の Dev Tools に表示される HTTP 応答の Cookie 値は次のとおりです。

Set-Cookie: MyUserSession=JxQoyzYm1VfESmuh-v22wyiyLREyOkuQWauziTrimjKo=;expires=Sun, 10 Feb 2013 22:08:47 GMT;path=/api/rest/

したがって、4 時間後に有効期限が切れます。

ただし、Cookie は保存されず、後続のリクエストで送信されません (Chrome と Firefox の両方でテスト済み)。最初は「2013 年 2 月 10 日」ではなく「2013 年 2 月 10 日」に違いないと思っていましたが、違いはありません。Chrome では、応答の Cookie タブに「無効な日付」として「有効期限」も表示されますが、これはDev Tools のバグである可能性もあります。

何か案は?

4

3 に答える 3

29

私は解決策を見つけたと思います。開発中、サーバーは「localhost:30002」にあり、Web アプリは「localhost:8003」にあるため、CORS に関しては異なるホストと見なされます。したがって、サーバーへのすべてのリクエストは、CORS セキュリティ ルール、特にRequests with credentialsによってカバーされます。「資格情報」には、そのリンクに記載されているように Cookie が含まれているため、返された Cookie は渡されなかったため、受け入れられませんでした

xhrFields: {
  withCredentials: true
}

jQueryの$.ajax機能に。また、Cookie を送信するために、そのオプションを後続の CORS リクエストに渡す必要があります。

Access-Control-Allow-Credentials: trueサーバー側にヘッダーを追加し、Access-Control-Allow-Originヘッダーをワイルドカードからhttp://localhost:8003(ポート番号は重要です!) に変更しました。その解決策は私にとってはうまくいき、クッキーが保存されます。

于 2013-02-10T20:12:06.590 に答える
4

同様のシナリオ (CORS なし) と何時間も格闘した後、別の潜在的な理由を見つけました。cookie のパスを明示的に設定してください。

私のフロントエンド アプリは を呼び出していましたが、これは正しいヘッダーをパスなしでHOST_URL/api/members/login返していました。Set-Cookie

Response CookiesChrome DevTools でCookie を確認できましたが、後続のリクエストには含まれていませんでした。に行きchrome://settings/cookies、クッキーはそこにありましたが、パスは でした/api/members

サーバー側で Cookie を設定するときにルート パスを指定すると、問題が修正されました。

于 2015-09-21T10:10:46.680 に答える
0

日付はどこから取得しますか?

手動で追加する場合は、フェイルプルーフにしてみてください

var exdays = 3; //3 days valid as an example
var exdate=new Date();
exdate.setDate(exdate.getDate() + exdays);
//Now set the cookie to said exdate
document.cookie = "MyUserSession =" + escape(JxQoyzYm1VfESmuh-v22wyiyLREyOkuQWauziTrimjKo=)+"; expires="+exdate.toUTCString());
于 2013-02-10T18:32:10.493 に答える