【问题标题】:"Refused to set unsafe header 'Cookie' " while sending cookies with GET request in angular 6“拒绝设置不安全的标头'Cookie'”,同时以角度 6 发送带有 GET 请求的 cookie
【发布时间】:2019-06-01 04:52:27
【问题描述】:

我正在使用 Angular 6 的 Spring Security。当我使用基本身份验证服务器登录时,会发送一个带有响应的 cookie JessionID。我想将此 cookie 与其他请求一起发送以进行身份​​验证,但它给了我错误 Refused to set unsafe header 'Cookie' 。当我在标头中使用相同的 cookie 从邮递员访问相同的端点时,它可以工作。

下面是angular中的方法:

注意:目前我正在手动添加标题。

private heroesUrl = 'http://localhost:8080/hi';
     header = new HttpHeaders().set("Cookie", "JSESSIONID=A2A75EC9A3E1172D60060C6E708549B5");
    getMessage() :Observable<Message>{
      return this.http.get<Message>(this.heroesUrl,{headers:this.header});
    }

我使用基本身份验证登录时得到的响应

【问题讨论】:

  • 我遇到了同样的问题,但情况不同。您不能使用代码中的请求手动设置 Cookie 标头。此外,如果 cookie 是 httponly,则代码无法访问它。但是,当我使用邮递员提出请求时,它起作用了。就我而言,我通过将我的应用程序设置在与服务器相同的端口上来规避了这个问题。如果请求来自同一来源,则会自动发送 cookie。

标签: java angular spring-boot cookies spring-security


【解决方案1】:

你不能这样做,因为浏览器不允许你这样做。让我在这里描述一下问题:

您是否注意到响应标头中的Set-Cookie: JSESSIONID=......; Path=/; HttpOnly?好吧,问题是 HttpOnly 标志。实际上 :) 这不是问题,它是一个防止旨在窃取浏览器 cookie 的攻击的功能:

HttpOnly 是添加到 cookie 的标志,它告诉浏览器不要通过客户端脚本(document.cookie 和其他)显示 cookie。 ...当您使用 HttpOnly 标志设置 cookie 时,它​​会通知浏览器此特殊 cookie 只能由服务器访问

所以浏览器不允许任何 javascript 代码访问这个变量。如果您可以更改该值,那么它就不再是 HttpOnly 标记的 cookie 了:)

如果您想通过 javascript 发送此 cookie,您应该通过 Authorization 标头发送它并在 Java 服务器中编写中间件,以便它从 Authorization 标头中捕获这些值并将它们视为 JSESSIONID cookie .你没有更多选择了:)

【讨论】:

  • 正如你提到的,javascript 无法访问 cookie 我将如何使用它来发送授权标头?
  • 为什么要发送,浏览器应该通过 Cookie 头自动发送。不是吗?
  • 但浏览器没有发送任何 cookie 标头
  • 浏览器将发送通过set-cookie 标头接收的cookie。您设计的问题是您试图发送通过httpOnly 标志检索并由服务器在您的浏览器上通过javascript 代码设置的cookie。
  • 我删除了我发送 cookie 的那一行,假设浏览器本身会发送 cookie 但它不会。虽然当我直接从 chrome 访问端点时,它确实会发送带有请求的 cookie,但当我从 angular 发送请求时却不会
【解决方案2】:

我也遇到了这个问题,现在刚刚解决。

我意识到,如果您通过选项{withCredentials: true},您的浏览器将自动发送所有可用的 cookie 以及您的请求。这样你就不必手动添加cookie,所以它很流畅,我认为它也更安全。

将您的代码更改为此并查看和检查。

当路径与你的前端相同时,Cookies可用。

private heroesUrl = 'http://localhost:8080/hi';
 
getMessage() :Observable<Message>{
  return this.http.get<Message>(this.heroesUrl, {withCredentials: true});
}

【讨论】:

  • 很遗憾,这对我不起作用。
  • 真的很不幸,你可能还有另一个潜在的问题。 @Xonshiz 查看整个 cookie 对象,确保它不包含阻止其发送的标志。
  • 是的,已经检查过了,浏览器仍然显示“cookie”不能设置为标头值。
  • 你有一个特殊情况,所以投票否决这个答案是对它会帮助的人的屈从。甚至对此处类似问题的其他答案也表明这是解决@Xonshiz 问题的一种正确方法。
猜你喜欢
  • 2013-07-24
  • 2018-01-17
  • 2016-01-13
  • 2023-03-13
  • 1970-01-01
  • 1970-01-01
  • 2016-11-30
  • 1970-01-01
相关资源
最近更新 更多