设置饼干标头不保存饼干



我知道这个问题已经被问了很多次,但与绝大多数人一样,答案是将"withCredential"标头设置为 true,它对我不起作用,我仍在寻找对正在发生的事情的理解。

我正在开发一个 Angular 应用程序,在登录时,服务器在响应中返回一个 WebSession 令牌和一个 set-cookie 标头。 我能够在 Chrome 检查器中看到 set-cookie 标头:

但正如我在标题中所说,饼干没有保存...... 我读到在 XHR 请求中可以忽略 set-cookie 标头,但我也读到许多其他线程说带有凭据的选项应该可以解决问题。

所以我对这些行为仍然有点困惑,我想了解 macanism 而不是只是复制/粘贴堆栈溢出答案,直到这起作用。

在我的请求标头中,我指定了我想要 WithCredentials:没错,通过使用角度 http 拦截器,我还指定了另外两个标头: "访问控制允许源":"*", "访问控制允许凭据":"true",

request = request.clone({
withCredentials: true,
setHeaders: {
Authorization: `Bearer ${currentUser.webSessionToken}`,
"Access-Control-Allow-Origin": '*',
"Access-Control-Allow-Credentials": 'true',
}
});

在服务器端,我最终添加了一个带有 jersey 的 CORS 过滤器来配置响应标头:

public void filter(ContainerRequestContext request,
ContainerResponseContext response) throws IOException {
response.getHeaders().add("Access-Control-Allow-Origin", "*");
response.getHeaders().add("Access-Control-Allow-Headers",
"origin, content-type, accept, authorization, X-Requested-With, X-HTTP-Method-Override");
response.getHeaders().add("Access-Control-Allow-Credentials", "true");
response.getHeaders().add("Access-Control-Allow-Methods",
"GET, POST, PUT, DELETE, OPTIONS, HEAD");
}

有什么我忘记了什么吗?

编辑:

我注意到的另一个奇怪行为:当我注销(清理存储以摆脱网络会话令牌(并再次登录时,cookie 会在身份验证请求中发送,值来自上次尝试,但仍然没有显示在 chrome 的 cookie 选项卡中:

具有设置 Cookie 标头的身份验证响应

身份验证登录和注销

铬中的饼干标签

当您设置cookie时,您还需要指定cookie的路径(/可以在任何地方使用(。如果没有,浏览器将认为 cookie 仅适用于设置的路径。

因此,如果 cookie 在调用http://api.com/login时是湿的,那么 cookie 只会在调用http://api.com/login*http://api.com/login/something时包含在后续请求中

注意

您需要从角度代码中删除Access-Control-Allow-*****标题。

这些是服务器端标头,最终可能会导致更多 CORS 问题,因为后端Access-Control-Allow-Headers提供的列表中不允许使用这些标头。

最新更新