2016-07-26 21 views
6

Ich habe heute mit diesem Problem zu kämpfen, da ich eine Cross-Site-API-Aufruf implementieren. Das Schlimmste ist es gut von meinem lokalen Umfeld funktioniert, aber einmal auf Heroku, schlägt es mit dem folgenden Fehler:Angular2: X-XSRF-TOKEN ist nicht zulässig von Access-Control-Allow-Header

XMLHttpRequest cannot load https://restcountries.eu/rest/v1/all . Request header field X-XSRF-TOKEN is not allowed by Access-Control-Allow-Headers in preflight response.

Hier wird die Funktion Auslösung des Anrufs:

let observable = this._http 
    .get(GEO_API_URL + query) 
    .map(response => response.json()) 
    .do(val => { 
     this.cache = val; 
     observable = null; 
    }) 
    .share(); 

    return observable; 

Jede Idee?

Danke.

+0

That muss auf dem Server konfiguriert werden und ist nicht mit Angular2 verbunden. Siehe auch http://stackoverflow.com/questions/10143093/origin-is-not-allowed-by-access-control-allow-origin –

+0

Danke für deine Antwort Günter. Ich weiß, es ist nicht winklig, aber es sollte eine Art Workaround geben? Aber wenn ich versuche, die Access-Control-Request-Header zu ersetzen, heißt es: "Weigerte sich, unsafe Header zu setzen". – kfa

+0

Ich weiß nicht, wo Sie die Kopfzeile ersetzen und ich weiß nicht, welche Abhilfe Sie meinen. Angular ist daran nicht beteiligt, die Preflight-Anfrage wird von Ihrem Browser nicht von Angular erstellt. Erst nachdem die Antwort auf die Preflight-Anfrage die richtigen Header enthält, führt der Browser die tatsächliche Anfrage aus, die von Angular initiiert wurde. –

Antwort

30

Haben die gleichen Problem.
In meinem Fall war der Grund, dass in meinem Chrome-Cookies X-XSRF-TOKEN Feld gespeichert wurde. Und irgendwie hat Chrome den Header 'Access-Control-Request-Headers: x-xsrf-token' zur OPTION-Anfrage hinzugefügt. In Firefox funktioniert die gleiche Seite auch im Inkognito-Modus Chrome.
Also ich habe gerade löschen dieses Cookie-Feld (X-XSRF-TOKEN) und das ist alles.

+0

Vielen Dank, ich hatte eine harte Zeit zu versuchen, eine Antwort für ein ähnliches Problem zu finden – Uness

+0

Sicher, kein Problem. Froh, dass ich Helfen kann) –

0

das half mir in Java (die Header freizugeben und dann in die Header zulassen). Dies wird zeigen, dann in Ihrem Httpresponse-Objekt:

response.addHeader("Access-Control-Expose-Headers", "header1"); 
response.addHeader("Access-Control-Expose-Headers", "header2"); 
    response.addHeader("Access-Control-Expose-Headers", "header3"); 
       response.addHeader("Access-Control-Allow-Headers", "Origin, header1, header2, header3, X-Requested-With, Content-Type, Accept"); 
0

Client (Angular 4)

@Injectable() 
export class HttpService { 
    private actionUrl: string; 
    private headers: Headers; 
    private options: RequestOptions; 

    constructor(public _http: Http) { 
    this.actionUrl = 'example.com'; 
    this.headers = new Headers(); 
    this.headers.append('Content-Type', 'application/json'); 
    this.headers.append('Accept', 'application/json'); 
    this.headers.append('Access-Control-Allow-Headers', 'Content-Type, X-XSRF-TOKEN'); 
    this.options = new RequestOptions({ headers: this.headers }); 
    } 

Server

GET, POST

1) Access-Control-Allow- Ursprung: '*'

OPTIONS

1) Access-Control-Allow-Origin: '*'

2) Access-Control-Allow-Header: ‚Content-Type, X-Amz-Date, Authorization, X-Api -Key, X-Amz-Sicherheit-Token, X-XSRF-TOKEN Access-Control-Allow-Headers'

3) Access-Control-Allow-Methoden: 'POST, GET, OPTIONS'