如何在Response头Angular2中获取值

has*_*ash 21 http angular

我想在响应头(Set-Cookie)中获取会话令牌.如何才能访问Response头中的值?

var headers = new Headers();
            headers.append('Content-Type', 'application/json');
            console.log('url',this.loginUrl)
            this.http.post(this.loginUrl,
                JSON.stringify({ "username": value.username, "password": value.password }),
                { headers: headers })
                .map((res: Response) => 
                    res.json())
                .subscribe((res) => {
                    console.log("res", res);
                    this.loading.hide();
                    if (res.message_code == "SUCCESS") {
                        this.nav.setRoot(HomePage, {
                            username: value.username,
                        });
                    } else {
                        let alert =  Alert.create({
                            title: "Sign In Error !",
                            subTitle: 'Please Check Username or Password.',
                            buttons: ['Ok']
                        });
                        this.nav.present(alert);
                    }
                }, err => {
                    this.loading.hide();
                    console.log('error', err);

                }); 
Run Code Online (Sandbox Code Playgroud)

这是我的标题回复

在此输入图像描述

Thi*_*ier 26

问题是您将响应映射到其json内容.可以从响应本身到达标头.所以你需要删除map运算符:

this.http.post(this.loginUrl,
       JSON.stringify({ "username": value.username, "password": value.password }),
       { headers: headers })
        /*.map((res: Response) =>  // <--------------
                res.json())*/
       .subscribe((res) => {
         var payload = res.json();
         var headers = res.headers;

         var setCookieHeader = headers.get('Set-Cookie')
         (...)
       });
Run Code Online (Sandbox Code Playgroud)

在访问响应头时要小心CORS.看到这个问题:

  • 是的,但是XHR(XMLHttpRequest)将跳过在跨域请求(CORS)的上下文中的"Access-Control-Allow-Headers"标头中未指定的标头;-) (5认同)

edk*_*ked 5

解决该问题的一种方法是从后端指定要显示的标题中的哪一对{key:value}.

使用java后端,您可以添加以下行:

public void methodJava(HttpServletResponse response){
...
response.addHeader("access-control-expose-headers", "Set-Cookie");
}
Run Code Online (Sandbox Code Playgroud)

现在,您可以通过这种角度访问此cookie元素

service(){
...
return this.http
    .get(<your url here for your backend>)
    .map(res => console.log("cookie: " + res.headers.get("Set-Cookie") )
}
Run Code Online (Sandbox Code Playgroud)

这里有更多解释