我有以下休息端点,我想与我的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));
}
MyCustomResponse
class MyCustomResponse {
private final String token;
public MyCustomResponse(String token) {
this.token = token;
}
}
我还尝试手动创建ResponseEntity
并使用"Set-Cookie"
标题在标题中设置Cookie,但同样的事情,没有cookie。
编辑:我已确认Set-Cookie
标头实际上存在于响应中,但实际上并未存储在浏览器中。我正在使用在WebStorm中运行的静态Web应用程序来访问在不同端口上运行的我的休眠端点。这个Web应用程序只是使用JQuery的$ajax
方法来调用REST端点,没什么特别的。当我在WebStorm中运行Web应用程序时,我能够在浏览器中看到它创建的cookie,以确认我的浏览器允许cookie存储。
答案 0 :(得分:2)
我明白了。我用来访问我的其他api的我的Web应用程序运行在与我的其他api不同的本地端口上。这导致AJAX请求失败CORS要求,因此cookie实际上没有设置。
我在这里找到了解决方案What can cause a cookie not to be set on the client?
编辑:我应该补充一点,它是将xhrFields
代码段添加到JQuery的$ajax
方法中,为我修复了它,其他部分则不是必需的。
(发布以下答案以防被删除)
我想我找到了解决方案。由于在开发期间,我的服务器位于“localhost:30002”,而我的Web应用程序位于“localhost:8003”,因此它们被视为与CORS不同的主机。因此,我对服务器的所有请求都包含在CORS安全规则中,尤其是Requests with credentials。 “凭据”包括该链接上注明的cookie,因此我不接受返回的cookie,因为我没有通过
xhrFields: {
withCredentials: true
}
到jQuery的$.ajax
函数。我还必须将该选项传递给后续的CORS请求才能发送cookie。
我在服务器端添加了标头Access-Control-Allow-Credentials: true
,并将Access-Control-Allow-Origin
标头从通配符更改为http://localhost:8003
(端口号很重要!)。该解决方案现在适用于我,并且存储了cookie。