2013-01-22 13 views
44

Wydaje się, że coś podobnego już zostało omówione na stackoverflow, ale nie mogłem znaleźć dokładnie tego samego.Żądanie POST z krzyżową domeną nie wysyła plików cookie Ajax Jquery

Próbuję wysłać plik cookie z CORS (udostępnianie zasobów dla różnych źródeł), ale nie działa.

To jest mój kod.

$.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); 
     } 
    } 
); 

Nie widzę tego cookie w żądaniu HEADER.

+0

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

Odpowiedz

51

Nie można ustawić ani odczytać plików cookie na żądanie CORS za pomocą JavaScript. Chociaż CORS zezwala na otrzymywanie żądań krzyżowych, pliki cookie są nadal objęte polityką tego samego pochodzenia przeglądarki, co oznacza, że ​​tylko strony z tego samego źródła mogą czytać/zapisywać pliki cookie. withCredentials oznacza tylko, że wszelkie pliki cookie ustawione przez zdalnego hosta są wysyłane do tego zdalnego hosta. Będziesz musiał ustawić plik cookie ze zdalnego serwera, używając nagłówka Set-Cookie.

+0

To naprawdę dziwne. Dlaczego nie mogę przekazywać plików cookie w nagłówku? –

+2

Chociaż CORS zezwala na otrzymywanie żądań krzyżowych, pliki cookie są nadal objęte polityką tego samego pochodzenia przeglądarki, co oznacza, że ​​tylko strony z tego samego źródła mogą odczytać/zapisać plik cookie. – monsur

+0

Dziękuję wszystkim. Wydaje się, że nie ma tutaj dyskusji. –

18

Pamiętaj, że to nie rozwiązuje problemu z dzieleniem się plikami cookie, ponieważ generalnie jest to zła praktyka.

Musisz być przy użyciu jsonp jako typ:

Od $ .ajax Dokumentacja: żądań między domenami i dataType: „jsonp” wnioski nie obsługują synchroniczne działanie.

$.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

Dzięki @Justin Schuhmann Właściwie I rzeczywiście trzeba zrobić CORS żądania, nie jsonp. Czy CORS nie obsługuje przesyłania plików cookie? –

+0

Cześć, Właściwie używając dataType: "text", pracował dla mnie jak urok! Dzięki! –

+1

Co to jest zła praktyka? Używanie plików cookie w zapytaniach CORS? Jeśli tak, dlaczego jest to zła praktyka? – Mnebuerquo

5

Miałem ten sam problem. Identyfikator sesji jest wysyłany w pliku cookie, ale ponieważ żądanie to dotyczy wielu domen, ustawienia zabezpieczeń przeglądarki blokują wysyłanie pliku cookie.

Rozwiązanie: Generowanie identyfikator sesji na kliencie (w przeglądarce), użyj Javascript sessionStorage do przechowywania identyfikatora sesji następnie wysłać identyfikator sesji z każdego żądania do serwera.

Bardzo dużo z tym problemem borykałem się i nie było zbyt wielu dobrych odpowiedzi. Oto artykuł z wyszczególnieniem rozwiązanie: Javascript Cross-Domain Request With Session