【问题标题】:Unable to access a response cookie in Angular.js无法访问 Angular.js 中的响应 cookie
【发布时间】:2017-10-09 17:43:54
【问题描述】:

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

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

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

我无法这样做,因为我收到空结果。

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

$cookies.get("AuthToken")

不会工作。

【问题讨论】:

标签: angularjs cookies


【解决方案1】:

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

  1. 尝试通过 headers.('set-cookie') 访问 cookie 不起作用,并返回 null。我试图通过在服务器上的 CORS 过滤器中设置公开标头选项来纠正此问题,但这仍然不起作用。
  2. 需要能够访问 cookie 值,以便将其保存到我的域的 cookie 中,因为这是指定 cookie 保留多长时间的关键步骤。否则,它会在浏览会话结束时过期,这是不好的。
  3. 仅使用 with-credentials: true 是不够的,因为 cookie 然后存储在我的服务器域下,而不是前端站点。因此,由于 XSS 保护,我的网站无法访问 cookie。我需要能够将 cookie 保存到网站的存储中,这主要是由于原因 2 中所述。

因此,这是我为解决这些问题所做的。

在我的服务器上,我在响应中添加了一个新的自定义标头“身份验证”。 这可以通过在响应中添加以下内容来完成:

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

}

请注意,如果直接复制和粘贴,这将不起作用,因为您需要将 [My site] 值替换为您自己的域,否则您的请求将不满足 CORS 过滤器。

最后,这意味着在客户端我可以轻松访问标题“身份验证”,如下所示。

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 我不确定这会有什么帮助,除非我弄错了,这与从响应中获取 cookie 无关。
    • 如果您查看此部分:transformResponse,您会找到一种访问响应标头的方法,因为 transformResponse 填充 (data, headersGetter, status) 作为其回调的参数。
    猜你喜欢
    • 2018-09-21
    • 2020-03-26
    • 2018-01-03
    • 2020-02-11
    • 1970-01-01
    • 1970-01-01
    • 2016-02-16
    • 2011-03-29
    • 2017-03-21
    相关资源
    最近更新 更多