代码之家  ›  专栏  ›  技术社区  ›  secondbreakfast

Spring@RestController未设置带有响应的cookies

  •  3
  • secondbreakfast  · 技术社区  · 7 年前

    我有以下rest端点,我想随我的 ResponseEntity . 然而,在成功发送响应后,找不到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;
        }
    }
    

    我还尝试创建 "Set-Cookie" 标题,但同样的东西,没有饼干。

    :我已确认 Set-Cookie 标题实际上存在于响应中,但它实际上并没有存储在浏览器中。我正在使用运行在WebStorm中的静态web应用程序访问运行在不同端口上的rest端点。此web应用程序仅使用JQuery的 $ajax

    1 回复  |  直到 7 年前
        1
  •  3
  •   secondbreakfast    7 年前

    我想出来了。我用来访问rest api的web应用程序运行在与rest 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

    xhrFields: {
      withCredentials: true
    }
    

    到jQuery的 $.ajax 作用为了发送cookie,我还必须将该选项传递给后续的CORS请求。

    我添加了标题 Access-Control-Allow-Credentials: true 在服务器端,更改了 Access-Control-Allow-Origin 标题从通配符到 http://localhost:8003 (端口号很重要!)。该解决方案现在对我有效,并且存储了cookie。