我正在使用带有 Angular 9 的 Spring Boot 和 STATELESS 会话实现。该应用程序正在成功执行登录和注册功能。字符串引导会在每个登录请求上生成令牌(JWT)。登录后,当我尝试运行第二个 TAB 的应用程序时,它再次要求我登录。为了克服这个问题,我将令牌保存在 Localstorage 中,然后在单击另一个 TAB 时,角度代码能够从 Localstorage 中选择令牌。但经过一些研发后,我知道应该使用 HTTPOnly Cookie 来代替 Localstorage。有人可以帮助我在 Angular 9 和 Spring Boot 中使用仅限 HTTP 的 cookie。谢谢
问问题
1016 次
2 回答
1
这是创建 HTTP Only cookie 并将其附加到您的响应的示例代码。至少您需要传入 HttpServletResponse 以将 cookie 附加到标头。您可以使用 ResponseEntity 或其他东西来返回响应正文中的任何内容。
@PostMapping("/refresh_token")
public ResponseEntity refreshToken(HttpServletResponse response)
{
//create cookie for refresh token
Cookie refreshTokenCookie = new Cookie("refresh_token", refreshToken);
refreshTokenCookie.setHttpOnly(true);
refreshTokenCookie.setSecure(true); //only allows HTTPS
refreshTokenCookie.setPath("/");
refreshTokenCookie.setDomain("api.lsp.com"); //restrict domain
response.addCookie(refeshTokenCookie);
return ResponseEntity(HttpStatus.OK);
}
于 2020-10-21T19:25:26.807 回答
0
实际上,刷新令牌应该设置为 cookie http,而不是本地存储,因为这里很好地解释了JWT 刷新令牌流 为了回答你的问题,@user521990 的响应是 cookie 实现的一个很好的例子:
- 请小心设置
refreshTokenCookie.setSecure(false);
为开发模式,因为您没有使用 HTTPS - 此外,如果您没有明确地设置域(),那么请求的域将是默认域
- 然后将路径设置为
refreshTokenCookie.setPath("/");
将使其成为可在任何地方访问的全局cookie
在开发模式下,您将需要一些 CORS 配置来启用在浏览器中设置的 cookie。至少您需要在 Java 控制器中进行以下配置@CrossOrigin(origins = "http://localhost:4200", allowCredentials = "true")
(或者您可以在不同的文件中更全局地进行此配置)
最后在 Angular 应用程序中,{ withCredentials: true }
为需要设置或使用 httponly cookie 的请求添加选项
于 2021-03-17T15:41:52.157 回答