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。
我有以下休息端点,我想连同我的 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。