2013-02-19 15 views
5

Mam klienta JS (app.domain.com), który łączy się z API napisane w szynach i winogron (api.domain.com). CORS jest skonfigurowany i mam wspólny plik cookie między dwiema domenami, ponieważ logowanie odbywa się na serwerze api.domain.com.Ustawienia domyślne dla wszystkich wywołań ajax jQuery

Ta aplikacja JS używa Spine.js, więc wszystko jest napisane w CoffeeScript. Tak, aby wysłać żądanie usunięcia wystarczy użyć:

@item.destroy 

Ten wyśle ​​DELETE żądanie do API. Jednak plik cookie nie są wysyłane wraz z nagłówka żądania, więc musiałem zmienić powyższy wiersz kodu do tego:

$.ajax({ 
     url: "http://api.domain.com/tasks/" + @item.id, 
     type: "DELETE", 
     crossDomain: true, 
     xhrFields: { 
      withCredentials: true 
     } 
    }) 

I to działa idealnie. Wysyła on nagłówek odpowiedzi "Access-Control-Allow-Credentials: true" wzdłuż żądania, aby plik cookie został przesłany, a akcja uwierzytelniona.

Jednak w ten sposób będę musiał napisać linie kodu dla każdego żądania, które jest naprawdę czasochłonne, a także unieważnia korzyści ze struktury Spine.

Wiem, że możliwe jest ustawienie domyślnych ustawień ajax w jQuery, aby każde następne wywołanie ajaxowe korzystało z tych ustawień. Więc próbowałem:

jQuery.ajaxSetup({ 
headers: { 
    "X-Requested-With": "XMLHttpRequest", 
    "Access-Control-Allow-Credentials": "true" 
    }, crossDomain: true 
}); 

Które są w zasadzie te same ustawienia, które chciałbym umieścić na każdym wywołaniu ajax ręcznie. Jednak to podejście nie działa, mimo że widzę te nagłówki we wniosku wysłanym do interfejsu API (przez firebug).

Czy brakuje mi czegoś?

Z góry dziękuję!

Dav

+6

można spróbować: '$ .ajaxSetup ({ crossDomain: true, xhrFields: {withCredentials: true}}); '? – Kaeros

Odpowiedz

1

Niedawno miałem bardzo podobny problem i znalazł 2 proste sposoby robienia tego. Najpierw utworzyć funkcje Java Script do wywołania Ci tj:

function delete (url){ 
    $.ajax({ 
     url: url, 
     type: "DELETE", 
     crossDomain: true, 
     xhrFields: { 
      withCredentials: true 
     } 
    }) 
} 

czy ponownego użycia na wielu stronach proponuję stworzenie trochę klasy, które mogłyby zostać włączone do ponownego wykorzystania łatwo. Umożliwia to ustawienie więcej niż tylko ustawień domyślnych i tworzenie funkcji dla często używanych wywołań interfejsu API.

0

zrobić w bootstrap swojej aplikacji client-side:

$.ajaxSetup({ 
    xhrFields: { 
    withCredentials: true 
    } 
}) 

Następnie serwer musi odpowiedzieć w ten Cors nagłówek:

Access-Control-Allow-Credentials: true 
Powiązane problemy