Spring @RestController 没有设置带有响应的 cookie

Spring @RestController not setting cookies with response

我有以下休息端点,我想连同我的 ResponseEntity 一起发送 cookie。但是在成功发送响应后,找不到cookie。

@RequestMapping(value = "myPath", method = RequestMethod.POST)
public ResponseEntity<?> createToken(HttpServletResponse response)
    final String token = "a1b2c3d4e";

    Cookie cookie = new Cookie("token", token);
    response.addCookie(cookie);
    // Return the token
    return ResponseEntity.ok(new MyCustomResponse(token));
}

我的自定义响应

class MyCustomResponse {
    private final String token;
    public MyCustomResponse(String token) {
        this.token = token;
    }
}

我也尝试过手动创建 ResponseEntity 并在 header 中使用 "Set-Cookie" header 设置 cookie 但同样的事情,没有 cookie。

edit:我已确认 Set-Cookie header 实际上存在于响应中,但实际上并未存储在浏览器中.我在 WebStorm 中使用静态 web-app 运行ning 来访问我在不同端口上的其余端点 运行ning。这个网络应用程序只是使用 JQuery 的 $ajax 方法来调用 REST 端点,没什么特别的。当我 运行 WebStorm 中的网络应用程序时,我能够看到它在我的浏览器中创建的 cookie,从而确认我的浏览器允许存储 cookie。

我明白了。我用来访问我的休息 api 的 Web 应用程序 运行 在与我的休息 api 不同的本地端口上。这会导致 AJAX 请求无法满足 CORS 要求,因此实际上并未设置 cookie。

我在这里找到了解决方案What can cause a cookie not to be set on the client?

edit:我应该补充一点,它正在将 xhrFields 片段添加到 JQuery 的 $ajax 方法中,为我修复了它, 其他部分不是必需的。

(在下面发布答案以防被删除)

我想我找到了解决办法。由于在开发过程中,我的服务器位于 "localhost:30002" 而我的 Web 应用程序位于 "localhost:8003",因此它们被认为是 不同的 CORS 主机。因此,我对服务器的所有请求都受到 CORS 安全规则的保护,尤其是 Requests with credentials。 "Credentials" 包含 link 上注明的 cookie,因此返回的 cookie 未被接受,因为我没有通过

xhrFields: {
  withCredentials: true
}

到jQuery的$.ajax函数。我还必须将该选项传递给后续的 CORS 请求,以便发送 cookie。

我在服务器端添加了 header Access-Control-Allow-Credentials: true 并将 Access-Control-Allow-Origin header 从通配符更改为 http://localhost:8003 (端口号很重要!) .该解决方案现在适用于我,并且存储了 cookie。