2013-02-19 6 views
5

Ich habe einen JS-Client (app.domain.com), der eine Verbindung zu einer in Rails und Traube (API.Domain.com) geschrieben API herstellt. CORS ist eingerichtet und ich habe ein gemeinsames Cookie zwischen den beiden Domänen, wenn die Anmeldung auf dem Server api.domain.com durchgeführt wird.Standardeinstellungen für alle jQuery AJAX-Aufrufe

Diese JS-Anwendung verwendet Spine.js, so dass alles in CoffeeScript geschrieben ist. So eine Löschanfrage senden benutze ich nur:

@item.destroy 

Dies wird eine DELETE-Anfrage an die API senden. Allerdings wird das Cookie nicht zusammen mit den Request-Header gesendet, so musste ich diese die obige Codezeile ändern:

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

Und das funktioniert perfekt. Er sendet einen Antwortheader "Zugriffskontrolle-Erlauben-Anmeldeinformationen: Wahr" entlang der Anfrage, so dass der Cookie gesendet und die Aktion authentifiziert wird.

Allerdings muss ich auf diese Weise Zeilen Code für jede Anfrage schreiben, die wirklich zeitaufwendig ist und auch die Vorteile des Spine-Framework ausblendet.

Ich weiß, dass es möglich ist, Standard-AJAX-Einstellungen in jQuery einzustellen, so dass jeder nachfolgende AJAX-Aufruf diese Einstellungen verwendet. Also ich habe es versucht:

Die sind im Grunde die gleichen Einstellungen würde ich für jeden Ajax Anruf manuell setzen. Allerdings funktioniert dieser Ansatz nicht, obwohl ich diese Header in der Anfrage an die API gesendet (über Firebug) sehe.

Fehle ich etwas?

Vielen Dank im Voraus!

Dav

+6

könnten Sie versuchen: '$ .ajaxSetup ({ crossDomain: true, xhrFields: {withCredentials: true}}); '? – Kaeros

Antwort

1

Vor kurzem hatte ich ein sehr ähnliches Problem und fand zwei einfache Möglichkeiten, dies zu tun. Erster Java-Script-Funktionen erstellen, um die Anrufe für Sie heißen:

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

oder wenn auf mehreren Seiten wiederverwendet wird, würde ich vorschlagen, eine kleine Klasse zu schaffen, die leicht aufgenommen und wiederverwendet werden können. Dies ermöglicht es auch, mehr als nur die Standardeinstellungen festzulegen und Funktionen für häufig verwendete API-Anrufe zu erstellen.

0

Tun Sie dies in der Bootstrap Ihrer clientseitige App:

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

Dann wird der Server mit dieser reagieren muss CORS-Header:

Access-Control-Allow-Credentials: true 
Verwandte Themen