Spring -> React:无法以任何方式设置 cookie

问题描述 投票:0回答:1

我知道我知道,有成千上万的论坛和问题,人们可以让它发挥作用,我已经遵循了他们所有的建议,但我仍然无法做到正确,我真的在这上面浪费了几天,希望有人会帮助我的。

所以,我在 Spring 中有一个控制器,带注释:

@CrossOrigin(origins = "http://localhost:3000", allowCredentials = "true")

从这个控制器中,我返回 set-cookie 的标头:

return ResponseEntity.ok()
                .header(HttpHeaders.SET_COOKIE, my_cookie)
                ...

my_cookie 是这样制作的:

ResponseCookie.from("cookie_name", value)
                .path("/")
                .httpOnly(true)
                .secure(false)
                .domain("localhost")
                .build()
                .toString();

在你说什么之前,是的,我已经尝试了在互联网上找到的所有可能的组合:

secure false|true --> 据我了解 true 仅适用于 https,因此对于本地主机测试应该为 false

域 --> 我尝试过 localhost、localhost.org、localhost.test、my.localhost.org,根本没有域...

samesite --> 要么 strict|none|lax ,我已经尝试了所有它们与其他标志的所有组合。

Spring 位于端口 8080。

然后,在反应中,在端口 3000 上,我调用身份验证:

async function login(email, password) {
    await fetch("http://localhost:8080/auth/login", {
      method: "POST",
      body: JSON.stringify({
        email: email,
        password: password,
      }),
      headers: {
        Accept: "application/json",
        "Content-Type": "application/json",
      },
    })
      .then((response) => {
        return response.json();
      })
      .then((json) => {
        if (json.error) {
          const error = json.error;
          setShowError(true);
          setError(errorMap.get(error));
          return;
        }
        const token = json.payload.token;
        const refreshToken = json.payload.refreshToken;
        const name = json.payload.name;
        setCookie("token", token);
        setCookie("refreshToken", refreshToken);
        setCookie("name", name);
      })
      .catch(() => {
        setShowError(true);
        setError("Error from server");
      });
  }

所以,3 个 cookie 就设置好了,就像我在 React 中所做的那样。但是来自 spring 的 set-cookie 并未在应用程序 --> localhost:3000 cookies 上设置。 相反,我从邮递员那里得到了饼干。我知道它与浏览器相关,但我只想指出我正确地在邮递员上设置了 cookie。

查看浏览器中的控制台,有 Set-Cookie 标头,并且请求面板中也有“Cookies”选项卡。它只是在浏览器的 cookie 端没有设置。

而且,当我调用后续请求时,我看不到请求中的3个cookie。据我了解,cookie 应该始终包含在对 BE 的请求中,浏览器会自动执行此操作,对吗?

我知道,我似乎遗漏了一些细节。我已经尝试过使用 .test、.org...这些域,因为我已经阅读了有关 Set-Cookie 标头响应的文档,并阅读了有关双点/3 点等的内容...所以我尝试了它们也是。

请帮助我解决这个问题,这几天一直在尝试不同的组合。我也尝试过使用 Firefox,同样的结果。

reactjs spring cookies http-headers setcookie
1个回答
0
投票

终于解决了!!! 实际上有两个错误:第一个,我缺少凭据:在调用身份验证/登录时在反应中“包含”。 第二个错误,我设置了名称为“__Secure-”的cookie,这对于浏览器来说不是优选的。所以我就把“__”去掉了。

我现在使用的有效设置:

ResponseCookie.from("Secure-name", cookieValue)
                .path("/")
                .httpOnly(true)
                .secure(false)
                .domain("localhost")
                .build()
                .toString();

本地主机:3000反应

本地主机:8080 春天

@CrossOrigin(origins = "http://localhost:3000", allowCredentials = "true")

在身份验证控制器上。

此外,所有 cookie 现在都会在后续请求中正确发送。

© www.soinside.com 2019 - 2024. All rights reserved.