Set-cookie标头不保存cookie

时间:2020-05-19 07:53:33

标签: angular xmlhttprequest cors jersey-2.0 setcookie

我知道这个问题已经问过很多次了,但是对于大多数人来说,答案是将“ withCredential”标头设置为true,但它对我不起作用,我仍在寻找对什么是理解的知识。发生。

我正在使用Angular应用程序,在登录时,服务器在响应中返回WebSession令牌和set-cookie标头。 我可以在Chrome检查器中看到set-cookie标头:

但是正如我在标题中所述,cookie不会保存... 我读到在XHR请求中可以忽略set-cookie标头,但是我还读了许多其他线程,它们说withCredentials选项应该可以解决问题。

因此,我仍然对这些行为感到困惑,我想了解Macanism,而不是只复制/粘贴stackoverflow答案,直到可行为止。

在我的请求标头中,我指定了我想要WithCredentials:true,通过使用有角度的http拦截器,我还指定了另外两个标头: “访问控制允许来源”:'*', “ Access-Control-Allow-Credentials”:'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");
}

有什么我忘了吗?

编辑:

我注意到了另一个奇怪的行为:当我注销(清理存储空间以摆脱Websession令牌)并再次登录时,Cookie在身份验证请求中发送,其值取自上一次尝试的get,但仍然没有显示在Chrome的Cookie标签中:

Authentication response with set cookie header

Authentication log in and logout

Cookie tab in chrome

1 个答案:

答案 0 :(得分:0)

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

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

注意

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

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