是的,所以这个解决方案可能很糟糕,但我觉得这是必要的。原因是:
- 尝试通过 headers.('set-cookie') 访问 cookie 不起作用,并返回 null。我试图通过在服务器上的 CORS 过滤器中设置公开标头选项来纠正此问题,但这仍然不起作用。
- 我需要能够访问 cookie 值,以便将其保存到我的域的 cookie 中,因为这是指定 cookie 保留多长时间的关键步骤。否则,它会在浏览会话结束时过期,这是不好的。
- 仅使用 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,以解决最初在答案开始时确定的所有三个问题。