2017-02-17 12 views
2

Мне нужна помощь, я пытаюсь получить cookie из ответа, и я не могу найти способ, я довольно новичок в tsc и ng2.Angular 2 - Get cookie from response

Это NG2 HTTP POST

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

Это ответ сервера:

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 

Я смущен, потому что я не могу видеть его в заголовках массива ...

Результат console.log(response)

Response from Chrome console

Результат console.log(response.headers)

Headers array from Chrome console

..., но я могу видеть его в печенье разделе.

Cookies section in Chrome

Спасибо!

+0

попробуйте этот res.get ("set-cookie") и дайте мне знать –

+0

также попробуйте это для нескольких cookie-файлов let resHeader: Headers = res.headers; resHeader.getAll ('set-cookie'); –

+0

Привет @Vinay, во-первых, спасибо за ваше время. Ваше предложение не работает, потому что ответ не имеет заголовка с этим именем, пожалуйста, см. Мой отредактированный пост. –

ответ

10

Ну, после некоторых исследований, я обнаружил две проблемы с моей стороны.

Первый, cookie был настроен ОК, но я искал его не в том месте. Все это время я смотрел его под моим доменом localhost:3000, и файл cookie хранился правильно под доменом http://demo..., что и является правильным поведением. Я мог видеть его в chrome://settings/ ==> Показать дополнительные настройки ==> Все куки и сайт данных ... ==> и фильтрацию от удаленного хоста, как следующее:

enter image description here


Второй , Я забыл использовать withCredentials: true в остальных заголовках запросов, чтобы включить и принять cookie автоматически.

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

Спасибо @ Все за ваши ответы и время!

+1

С помощью этого ответа вы можете получить доступ к заголовку Set-Cookie с помощью 'response.headers' – PhoneixS

+0

, нет необходимости обращаться к Set-Cookie, потому что он автоматически добавляется для каждого запроса. Поэтому просто установите' withCredentials: true', и все должно работает отлично –

0

Я предполагаю, что вы используете модуль angular2 http, чтобы связаться с сервером, который вернет наблюдаемый ответ сервера.

Вы можете использовать ответ, если вы подписаться на него:

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

Вы также можете превратить наблюдаемое в Promise:

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

В некоторых случаях ответ вы, возможно, потребуется преобразовать его с помощью response.json() для извлечения и объекта.

Надеюсь, это поможет. Если это не то, что вы ищете, дайте мне более подробную информацию, и я постараюсь помочь.

+0

Привет @jparg, спасибо за ваше время, я использую сообщение, как вы уже опубликовали, но это не сработало, потому что, когда я проверяю массив заголовков, я не вижу на нем «set-cookie». , см. мое обновленное сообщение. –

+0

Хорошо, что это странно. Если вы попытаетесь получить файлы cookie с помощью: headers.getAll («set cookie»), я предполагаю, что вы получите пустой массив? – jparg

+0

Нет, я получаю 'null' –

 Смежные вопросы

  • Нет связанных вопросов^_^