无法访问Angular.js中的响应cookie

时间:2017-05-10 21:48:39

标签: angularjs cookies

我正在尝试从对$ http请求的响应中提取Cookie 请求返回就好了,还有cookie,但是我无法获取cookie,所以我可以存储它 回应的图片表明一切正常。

enter image description here

但是,如果我尝试通过诸如

之类的方法提取Set-Cookie标头的值
.then(function(response) {
     //First function handles success
     log(response.data);
     registrationOutcomeText = response.data;
     log(response.headers('Set-Cookie'));
}

我收不到空结果时无法这样做。

通过检查我的cookie,我知道它没有被保存,所以像

这样的东西
$cookies.get("AuthToken")

无效。

2 个答案:

答案 0 :(得分:1)

是的,所以这个解决方案可能很糟糕,但我认为这是必要的。原因是:

  1. 尝试通过标头访问Cookie。(' set-cookie')不起作用,并返回null。我试图通过在服务器上的CORS过滤器中设置expose headers选项来解决这个问题,但是这仍然无效。
  2. 需要才能访问Cookie值,因此我可以将其保存到我的域名Cookie中,因为这是指定保留Cookie的时间的关键步骤。否则,它会在浏览会话结束时到期,这是不行的。
  3. 仅使用with-credentials:true是不够的,因为cookie随后存储在我的服务器域下,而不是前端站点。因此,由于XSS保护,我的网站无法访问cookie。我需要能够将cookie保存到网站的存储空间,主要是因为原因二中概述了这一点。
  4. 因此,以下是我为解决这些问题所做的工作。

    在我的服务器上,我在响应中添加了一个新的自定义标题" Authentication"。 这可以通过在响应中添加以下内容来完成:

        .header("Authentication", authToken)
    

    (例如)

    return Response.status(200).entity(message).header("Authentication", authToken).build();
    

    接下来,我需要在我的CORS过滤器中公开这个自定义标题 由于我有一个Java服务器,这就是我的CORS过滤器的外观:

    @Provider
    public class NewCrossOriginResourceSharingFilter implements ContainerResponseFilter {
    
        @Override
        public void filter(ContainerRequestContext requestContext, ContainerResponseContext response) {
            response.getHeaders().putSingle("Access-Control-Allow-Origin", [My site]);
            response.getHeaders().putSingle("Access-Control-Allow-Methods", "OPTIONS, GET, POST, PUT, DELETE");
            response.getHeaders().putSingle("Access-Control-Allow-Headers", "Content-Type");
            response.getHeaders().putSingle("Access-Control-Expose-Headers", "Authentication");
            response.getHeaders().putSingle("Access-Control-Allow-Credentials", true);
        }
    
    }
    

    请注意,如果直接复制和粘贴,则无法正常工作,因为您需要将[我的网站]值替换为您自己的域名,否则您的请求将无法满足CORS过滤器的要求。

    最后,这意味着在客户端我可以访问标题" Authentication"很容易,如下所示。

    .then(function(response) {
            $scope.registrationOutcomeText = response.data;
            console.log(response.headers("Authentication"));
        }
    

    Response.

    从那里,我能够以解决在答案开始时最初确定的所有三个问题的方式访问,存储和检索cookie。

答案 1 :(得分:0)

我认为您的解决方案可以拦截响应,如文档中的“转换请求和响应”部分所示: https://docs.angularjs.org/api/ng/service/ $ HTTP