2017-02-17 3 views
2

Ich brauche Hilfe, ich versuche, den Cookie aus der Antwort zu bekommen, und ich kann keinen Weg finden, ich bin ziemlich neu mit TSC und ng2.Angular 2 - Get Cookie von Antwort

Dies ist die NG2 http Post

return this._http 
    .post('http://demo...', body, { headers: headers }) 
    .subscribe(
     (response: Response) => { 
      this.storeToken(response); 
     }, (err) => { 
      console.log('Error: ' + err); 
     } 
    ); 

Dies ist die Server-Antwort:

HTTP/1.1 200 OK 
Server: Apache-Coyote/1.1 
Access-Control-Allow-Origin: http://localhost:3000 
Access-Control-Allow-Credentials: true 
Access-Control-Allow-Headers: Content-Type, Access-Control-Allow-Headers, Authorization, X-Requested-With 
Set-Cookie: JSESSIONID=A099CC4CA7A25DFBD12701630A7DC24C; Path=/pbcp/; HttpOnly 
Content-Type: application/json;charset=UTF-8 
Transfer-Encoding: chunked 
Date: Fri, 17 Feb 2017 04:08:15 GMT 

32 
{"status":"OK","message":"User is Authenticated."} 
0 

Ich bin verwirrt, weil ich es nicht in Header-Array sehen ...

Ergebnis console.log(response)

Response from Chrome console

Ergebnis console.log(response.headers)

Headers array from Chrome console

..., aber ich kann es in Cookies Abschnitt.

Cookies section in Chrome

Dank!

+0

versuchen Sie diese res.get ("set-cookie") und lassen Sie mich wissen –

+0

versuchen Sie es auch für mehrere Cookies lassen resHeader: Header = res.headers; resHeader.getAll ('Set-Cookie'); –

+0

Hallo @Vinay, zuerst, danke für deine Zeit. Ihr Vorschlag hat nicht funktioniert, da die Antwort keine Kopfzeile mit diesem Namen enthält, siehe meinen bearbeiteten Beitrag. –

Antwort

10

Nun, nach ein paar Recherchen habe ich zwei Probleme von meiner Seite gefunden.

Zuerst, der Cookie wurde gesetzt, OK, aber ich habe es an der falschen Stelle gesucht. Die ganze Zeit habe ich es unter meiner Domain localhost:3000 gesucht, und der Cookie wurde korrekt unter http://demo... Domäne gespeichert, das ist das richtige Verhalten. Ich konnte es in chrome://settings/ sehen ==> Erweiterte Einstellungen anzeigen ==> Alle Cookies und Websitedaten ... ==> und Filterung von dem Remote-Host wie folgt:

enter image description here


Zweite , Ich habe vergessen, withCredentials: true im Rest der Anfrage Header auch zu verwenden, um das Cookie automatisch aufzunehmen und zu akzeptieren.

authenticate(username: string, password: string) { 
    var body = `{"username":"${username}","password":"${password}"}`; 
    var headers = new Headers(); 
    headers.append('Content-Type', 'application/json'); 
    let options = new RequestOptions({ headers: headers, withCredentials: true }); 

    return this._http 
       .post('http://demo...', body, options) 
       .subscribe(
        (response: Response) => { 
        this.doSomething(response); 
       }, (err) => { 
        console.log('Error: ' + err); 
       }); 
} 

Dank @All für Ihre Antworten und Zeit!

+1

Mit dieser Antwort können Sie auf den Set-Cookie-Header mit 'response.headers' zugreifen: – PhoneixS

+0

Es besteht keine Notwendigkeit, auf den Set-Cookie zuzugreifen, da er automatisch für jede Anfrage hinzugefügt wird.So einfach' withCredentials: true' einstellen und alles sollte funktioniert gut –

0

Ich nehme an, dass Sie das angular2 HTTP-Modul verwenden, um den Server zu kontaktieren, der eine Observable mit der Serverantwort zurückgibt.

Sie können die Antwort, wenn Sie ihn abonnieren:

//... 
http.post(...your content...) 
.take(1) // optional: depending on your needs you could .take(x) this to just take a certain number of responses and then terminate the subscription in order to not have a "hot Observable" lying around 
.subscribe(response =>{ 
     .console.log(response); 
    // if I am not mistaken "response.headers" should contain the "Set-Cookie" you are looking for 
}); 

Sie könnten auch die beobachtbaren zu einem Versprechen verwandeln:

http.post(...your content...) 
    .toPromise() 
    .then(response=>{ 
    console.log(response); 
    let headers = response.headers; 
    console.log(headers); 
    }) 
    .catch(err=>console.log(err)); 

In bestimmten Antwort Fällen müssen Sie möglicherweise es zu transformieren, mit response.json() zum Abrufen und Objekt.

Hoffe, das hilft. Wenn es nicht das ist, was Sie suchen, geben Sie mir weitere Einzelheiten und ich werde versuchen zu helfen.

+0

Hallo @jparg, danke für deine Zeit, ich benutze einen Beitrag wie du es geschrieben hast, aber das hat nicht funktioniert, denn wenn ich das Header-Array überprüfe, sehe ich den "set-cookie" nicht. Bitte Siehe meinen aktualisierten Beitrag. –

+0

Okay, das ist seltsam. Wenn Sie versuchen, die Cookies zu bekommen: headers.getAll ("set cookie") Ich nehme an, Sie erhalten ein leeres Array zurück? – jparg

+0

Nein, ich bekomme 'null' –