Spring @RestController没有设置响应

时间:2017-08-22 17:46:05

标签: spring-mvc cookies spring-restcontroller

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

1 个答案:

答案 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。