无法在服务端使用 Spring 启动设置 cookie

Unable to set cookies with Spring Boot on the serve side

我正在使用 Spring 在服务器端启动。当我向响应添加 cookie 时,它​​会添加具有正确值的 Set-cookie header,但是当浏览器收到响应时,它会显示 header 但不会设置 cookie。 Postman 也可以很好地存储所有 cookie。

Spring

public ResponseEntity<?> authenticate(@RequestBody AuthenticationRequest request, HttpServletResponse response) throws Exception {
        Cookie cookie = new Cookie("token", "COOKIE_VALUE");
        cookie.setHttpOnly(true);
        cookie.setSecure(false);
        response.addCookie(cookie);
        return ResponseEntity.ok("Connection succeeded");
    }

JSfetch(来自不同端口的 React 应用程序)

var myHeaders = new Headers();
myHeaders.append("Content-Type", "application/json");

var raw = JSON.stringify({"username":"TestUser","password":"pwd"});

var requestOptions = {
  method: 'POST',
  headers: myHeaders,
  body: raw,
  redirect: 'follow'
};

fetch("http://IP_ADDRESS:8080/authenticate", requestOptions)

Chrome 在 header 看到 cookie

但它不会将其添加到存储中

Firefox 也是如此。我错过了什么?有针对这个的解决方法吗? 我正在使用我的互联网 IP 地址通过端口 8080 获取 - 而不是本地主机。但是 localhost 也没有做到这一点。

更新。当端口相同时,它似乎可以工作。我尝试改为 return jsp 页面,该页面执行 fech 语句并存储了 cookie。所以解决这个问题的方法可能是编译 React 应用程序并将其放在服务器上。无论如何,当端口不相同时如何处理cookie?

好的,在 spring 启动

中更改它
@CrossOrigin

至此

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

拯救了我的一天。我仍然不明白为什么当我在 post 映射方法

中手动设置 headers 时它不起作用
response.addHeader("Access-Control-Allow-Credentials", "true");
response.addHeader("Access-Control-Allow-Origin", "http://MY_IP_ADDRESS");

只有当 JS 由同源(主机:端口)提供时,Cookie 才可访问。

您可以使用 URL 重写方法为您的资产和 API 使用相同的来源。如果您使用的是 Webpack,您可以查看 devServer

考虑一下 LocalStorage,它也提供了更现代的方法来处理它。

此致。

Chrome 已更改其最近的政策,不支持本地主机或开发 cookie,因此您必须变通并使用 HTTP cookie

 ResponseCookie resCookie = ResponseCookie.from(cookieName, cookieValue)
            .httpOnly(true)
            .sameSite("None")
            .secure(true)
            .path("/")
            .maxAge(Math.toIntExact(timeOfExpire))
            .build();
    response.addHeader("Set-Cookie", resCookie.toString());

这对我有用,但是,请确保它仅适用于 https(不适用于 HTTP),并且这只是为了开发目的而进行的改造,如果您托管您的服务器 chrome 允许响应 cookie,否则它只是阻止各种 HTTP cookie。