angular - 设置 cookie 标头不保存 cookie
问题描述
我知道这个问题已经被问过很多次了,但大多数人的答案是将“withCredential”标题设置为true,它对我不起作用,我仍在寻找对正在发生的事情的理解。
我正在开发一个 Angular 应用程序,在登录时,服务器返回一个 WebSession 令牌,并在响应中返回一个 set-cookie 标头。我可以在 Chrome 检查器中看到 set-cookie 标头:
但正如我在标题中所说,cookie 没有保存......我在 XHR 请求中读到 set-cookie 标头可以被忽略,但我也读了许多其他线程说 withCredentials 选项应该解决问题.
所以我对这些行为仍然有些困惑,我想了解 macanism 而不是复制/粘贴 stackoverflow 的答案,直到这有效。
在我的请求标头中,我指定了我想要 WithCredentials :是的,通过使用角度 http 拦截器,我还指定了另外两个标头:“Access-Control-Allow-Origin”:'*',“Access-Control-Allow-Credentials “: '真的',
request = request.clone({
withCredentials: true,
setHeaders: {
Authorization: `Bearer ${currentUser.webSessionToken}`,
"Access-Control-Allow-Origin": '*',
"Access-Control-Allow-Credentials": 'true',
}
});
在服务器端,我最终添加了一个带有球衣的 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");
}
有什么我忘记了吗?
编辑 :
我注意到另一个奇怪的行为:当我注销(清理存储以摆脱 websession 令牌)并再次登录时,cookie 在身份验证请求中发送,其值来自上一次尝试,但仍未显示在 chrome 的 cookie 选项卡中:
解决方案
/
设置服务器端时,您还需要指定 cookie 的路径(将在任何地方工作)。如果不是,浏览器将认为 cookie 仅适用于设置它的路径。
所以如果调用时cookie是湿http://api.com/login
的,那么cookie只会在调用时包含在后续请求中 http://api.com/login*
或http://api.com/login/something
笔记
您需要Access-Control-Allow-*****
从角度代码中删除标题。
Access-Control-Allow-Headers
这些是服务器端标头,最终可能会导致更多 CORS 问题,因为这些标头在您的后端提供的列表中是不允许的。
推荐阅读
- javascript - 在 JavaScript 函数中调用时如何从对象函数返回值
- google-sheets - 谷歌表格从字符串单元格的开头去除单引号
- api - REST API 任务的最佳实践(不是 CRUD)
- sql - 如何在处理 0 案例时跨一对多关系按列计数和分组?
- c# - 如何在 C# XML 文档注释中为参数指定示例值?
- java - 如何从 Spring Security 身份验证中排除删除 url?
- laravel - Laravel 7 将 React.js 添加到没有 composer 的项目需要 laravel/ui?
- python - Nominatim 在为其分配变量后返回配置错误
- sql - SQL如何通过动态变量名调用用户定义的函数
- csv - 如何使 Kotlin Jackson CSV 阅读器将列名映射到 POJO?