編集-Chrome Webインスペクターを使用してCookieを確認すると、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
ミドルウェアを試したことも言及する価値があります
シナリオに関して:
私はこれについて読んだこと以外は何も知りませんが、 MDN docs によると、XHRオブジェクトに「withCredentials」プロパティがあり、これを設定する必要があります。
xhr.withCredentials = true;
デフォルトでは、false
です。そのフラグが設定されていない場合、Cookieは送信されず、応答のCookieヘッダーは無視されます。
edit—私はあなたの質問を数回読んだことを誓いますが、私はあなたの旗についての言及を完全に見逃しました。ごめんなさい。ただし、これは完全な無駄ではないため、サーバーで応答ヘッダーの「Access-Control-Allow-Credentials」フラグをtrue
に設定する必要があることにも言及します。 -Control-Allow-Origin」を現在のプロトコル+ホスト+ポートに設定します。
これ 私に起こった 前に、そして私はそれがかなり愚かであると言うことができます。
仮想マシンを使用している場合は、通常、必要なときにいつでも仮想マシンを一時停止/再開します。
これは、仮想マシンの日付が、ホストまたは使用しているクライアントと比較して、通常、数日(またはそれ以上)遅れていることを意味します。
したがって、サーバーが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
私はちょうどこの問題を抱えていました、私の場合の解決策はクッキーへのパスを追加することでした、それでクッキーを追加するときあなたは使用しなければなりません:
document.cookie = 'cookieName=cookieValue;path=/';
このようにして、ブラウザは新しいリクエストでCookieを送信できるようになります。
PS:クロスドメインリクエストを使用している場合は、xhr.withCredentials = true;
も必要です。
同様の問題が発生し、ブラウザの設定がサードパーティのCookieをブロックしていることが判明しました(Chrome>設定>詳細設定>プライバシー>コンテンツ設定>サードパーティのCookieとサイトデータをブロックする)。ブロックを解除すると問題が解決しました。