我知道我知道,有成千上万的论坛和问题,人们可以让它发挥作用,我已经遵循了他们所有的建议,但我仍然无法做到正确,我真的在这上面浪费了几天,希望有人会帮助我的。
所以,我在 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,同样的结果。
终于解决了!!! 实际上有两个错误:第一个,我缺少凭据:在调用身份验证/登录时在反应中“包含”。 第二个错误,我设置了名称为“__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 现在都会在后续请求中正确发送。