2013-01-22 24 views
44

同様のことがすでにstackoverflowで議論されているようですが、まったく同じものは見つかりませんでした。クロスドメインのPOSTリクエストはクッキーを送信していませんAjax Jquery

CORS(クロスオリジンリソース共有)でCookieを送信しようとしていますが、機能しません。

これは私のコードです。

$.ajax(
    { 
     type: "POST", 
     url: "http://example.com/api/getlist.json", 
     dataType: 'json', 
     xhrFields: { 
      withCredentials: true 
     }, 
     crossDomain: true, 
     beforeSend: function(xhr) { 
      xhr.setRequestHeader("Cookie", "session=xxxyyyzzz"); 
     }, 
     success: function(){ 
      alert('success'); 
     }, 
     error: function (xhr) { 
      alert(xhr.responseText); 
     } 
    } 
); 

リクエストヘッダーにこのCookieが表示されません。

+0

http://stackoverflow.com/questions/3342140/cross-domain-cookies Schuhmann @Justin –

答えて

51

CORSリクエストのCookieは、JavaScriptを使用して設定または読み取ることはできません。 CORSは原点を越えた​​要求を許可しますが、クッキーは依然としてブラウザの同じ起点ポリシーに従います。つまり、同じ起点のページだけがそのクッキーを読み書きできます。 withCredentialsは、リモートホストによって設定されたクッキーがそのリモートホストに送信されることを意味します。 Set-Cookieヘッダーを使用して、リモートサーバーからCookieを設定する必要があります。

+0

それは本当に変です。なぜヘッダーにクッキーを渡すことができないのですか? –

+2

CORSはクロスオリジン要求を許可していますが、クッキーは依然としてブラウザの同じ起点ポリシーに従います。つまり、同じ起点のページだけがクッキーを読み書きできます。 – monsur

+0

ありがとうございます。ここでは議論するつもりはないと思われる。 –

18

これはCookieの共有プロセスを解決しないことに注意してください。通常、これは悪い習慣です。あなたがあなたのタイプとしてJSONPを使用する必要が

$アヤックスからは、ドキュメント: クロスドメインリクエストとデータ型:「JSONP」の要求が同期動作をサポートしていません。

$.ajax(
    { 
     type: "POST", 
     url: "http://example.com/api/getlist.json", 
     dataType: 'jsonp', 
     xhrFields: { 
      withCredentials: true 
     }, 
     crossDomain: true, 
     beforeSend: function(xhr) { 
      xhr.setRequestHeader("Cookie", "session=xxxyyyzzz"); 
     }, 
     success: function(){ 
      alert('success'); 
     }, 
     error: function (xhr) { 
      alert(xhr.responseText); 
     } 
    } 
); 
+2

おかげで実際に私が実際にCORS要求ではなく、JSONPを作成する必要があります。 CORSはクッキーの受け渡しをサポートしていませんか? –

+0

こんにちは、実際にdataTypeを使用しています: "text"、私の魅力のように私のために働いた!ありがとう! –

+1

悪い習慣とは何ですか? CORSリクエストでクッキーを使用しますか?もしそうなら、なぜそれは悪い練習ですか? – Mnebuerquo

5

私はこの同じ問題を抱えていました。セッションIDはCookieで送信されますが、要求はドメイン間であるため、ブラウザのセキュリティ設定によってCookieの送信がブロックされます。

ソリューション:クライアント(ブラウザ内)でセッションIDを生成し、JavascriptのsessionStorageを使用してセッションIDを保存し、次に各リクエストとともにセッションIDをサーバーに送信します。

私はこの問題で多くの苦労をしました。ここでは解決策を詳述記事です:Javascript Cross-Domain Request With Session

関連する問題