【问题标题】:Spring @RestController not setting cookies with responseSpring @RestController 未设置带有响应的 cookie
【发布时间】:2018-01-31 02:42:33
【问题描述】:

我有以下休息端点,我想连同我的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 并使用"Set-Cookie" 标头在标头中设置cookie,但同样的事情,没有cookie。

编辑:我已经确认Set-Cookie 标头实际上存在于响应中,但它实际上并未存储在浏览器中。我正在使用在 WebStorm 中运行的静态 Web 应用程序来访问在不同端口上运行的休息端点。这个 web 应用程序只是使用 JQuery 的 $ajax 方法来调用 REST 端点,没什么特别的。当我在 WebStorm 中运行网络应用程序时,我可以看到它在我的浏览器中创建的 cookie,从而确认我的浏览器允许存储 cookie。

【问题讨论】:

  • 对我来说很好。请提供minimal reproducible example 并向我们展示您如何提出请求以及如何确定Set-Cookie 不在回复中。
  • @SotiriosDelimanolis 好的,所以我刚刚想出了如何在 Firefox 中查看完整响应,并且确实有 Set-Cookie 标头。但是当我查看开发人员工具的存储选项卡时,没有 cookie。
  • 在我发送请求后,它就在那里。
  • @SotiriosDelimanolis 也许我找错地方了。我在 intellij 中使用静态 Web 应用程序来访问在不同端口上运行的休息端点。我可以看到来自 intellij 的 cookie 集,但我的休息点的 cookie 不存在
  • 抱歉,浏览器方面的事情我帮不上忙。

标签: spring-mvc cookies spring-restcontroller


【解决方案1】:

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

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

编辑:我应该补充一点,它是将xhrFields sn-p 添加到为我修复它的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 被存储。

【讨论】:

  • 我遇到了类似的问题,但我支持 AJP。
猜你喜欢
  • 1970-01-01
  • 2015-03-16
  • 2017-08-21
  • 1970-01-01
  • 1970-01-01
  • 2013-04-22
  • 2019-08-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多