27

編集 - Chrome Web インスペクターを使用して Cookie を見ると、Cookie の有効期限の値に関係なく、ブラウザーはそれをセッション Cookie として設定し、リクエストごとに削除するようです。

Node.js と Express を使用して、教えているクラスの CORS の例を作成しています。

ただし、Cookie はサーバーから設定されていますが、次の要求でサーバーに送り返されていません。これは、簡単なセッションマネージャーを使用できないことを意味します。

ここで何が欠けているのか分かりますか? ブラウザーがドメインによって設定された Cookie をそのドメインに送り返さないのはなぜですか? これは自動的に行われるべきではありませんか?

編集 - いくつかのコード例: XHR リクエストの設定:

var xhr = new XMLHttpRequest();

xhr.open(method, url, true);
xhr.widthCredentials = true;

xhr.onreadystatechange = function(res){
    if (xhr.readyState == 4){
        cb(res,xhr);
    }
};

xhr.setRequestHeader("Content-Type",'application/json');

xhr.setRequestHeader('Accept','application/json');

xhr.send(JSON.encode({param:some_param})); 

サーバ:

function allowCrossDomain(req,res,next) {  
    res.header('Access-Control-Allow-Credentials', true);
    res.header('Access-Control-Allow-Origin', req.headers.origin);
    res.header('Access-Control-Allow-Methods', 'GET,PUT,POST,DELETE,OPTIONS');
    res.header('Access-Control-Allow-Headers', 'Content-Type,Accept,X-Requested-With');

    if (req.method!='OPTIONS') return next();

    res.send(204);
}                 

//while configuring express
app.use(allowCrossDomain)

npmまた、目に見える違いなしで同じことを行うさまざまなミドルウェアを試したことにも言及する価値があります

シナリオについて:

  1. XHR を使用して CORS リクエストを行う
  2. サーバーは、クライアントに正常に送り返される Cookie を設定します (高速セッション Cookie)。
  3. 次の XHR リクエストはその Cookie をサーバーに送り返さないため、express はユーザーを識別できず、新しいセッション Cookie などを作成します。
4

4 に答える 4

36

これについては、読んだこと以外は何も知りませんが、MDN ドキュメントによると、XHR オブジェクトに「withCredentials」プロパティがあり、設定する必要があります。

xhr.withCredentials = true;

デフォルトでは、ですfalse。このフラグが設定されていない場合、Cookie は送信されず、応答の Cookie ヘッダーは無視されます。

編集— あなたの質問を数回読んだことを誓いますが、フラグについてのあなたの言及を完全に見逃していました。ごめん。trueただし、これは完全な無駄ではないため、サーバーが応答ヘッダーで「Access-Control-Allow-Credentials」フラグを設定する必要があること、および「Access-Control-Allow-Origin」についても言及します。" 現在のプロトコル + ホスト + ポートに設定します。

于 2012-07-22T15:01:00.060 に答える
6

これは以前に私に起こったことであり、それはかなりばかげていると言えます。

仮想マシンを使用している場合は、通常、必要に応じて一時停止/再開します。

これは、仮想マシンの日付が通常、ホストまたは使用しているクライアントと比較して数日 (またはそれ以上) 遅れていることを意味します。

そのため、サーバーが Cookie の有効期限 (通常は現在の日付から数時間後) を設定すると、クライアントでは既に有効期限が切れています。したがって、クライアントはそれを保持しません。

仮想マシンの日付を更新するには、単に を使用することをお勧めしますntpdate。または、日付を手動で設定して、それが問題かどうかを確認することもできます。

# what's the date?
date
# You'll see if it's the problem already

# If it is, here is how to manually set it
date -set 2012-07-22 # yyyy-mm-dd
date -set 17:00:42 # hh:mm:ss
于 2012-07-22T15:00:51.493 に答える
5

私はちょうどこの問題を抱えていました.私の場合の解決策は、Cookieへのパスを追加することでした.

document.cookie = 'cookieName=cookieValue;path=/';

このようにして、ブラウザは新しいリクエストで Cookie を送信できるようになります。

xhr.withCredentials = true;PS:クロス ドメイン リクエストを使用している場合は、 も必要です。

于 2017-05-10T17:34:15.680 に答える