【问题标题】:Only add cookie to response if it doesnt exist仅在不存在时将 cookie 添加到响应中
【发布时间】:2020-12-22 21:01:56
【问题描述】:

我需要检查是否已将 cookie 添加到响应中。

我有一个奇怪的问题,我的回复收到了两次 Set-Cookie 标头。

Set-Cookie:foo=bar; Domain=dev.mysite.com; Expires=Fri, 05-May-2062 04:05:43 GMT; Path=/

Set-Cookie:foo=bar; Domain=dev.mysite.com; Expires=Fri, 05-May-2062 04:05:43 GMT; Path=/

这两个标题完全相同。当我调试堆栈时调用此代码两次。这段代码的重复是由于我正在使用的网络堆栈,我无法更改。

我不关心请求中发送了哪些 cookie,但我不希望此标头发送两次。

似乎没有一种简单的方法可以找到通过addHeader 方法添加的cookie。

在调试期间,奇怪的是,如果我在 response.addCookie(myCookie); 调用之后检查响应对象中的标头,我看不到 Set-Cookie 标头。

如果响应中尚未发送同名的 cookie,我是否只能将 cookie 添加到响应中?

【问题讨论】:

  • 我不知道标准方法。您可能必须使用 HttpServletResponseWrapper 解决此问题并记住那里的 cookie?!
  • 是的,正如“home”(和 AFAIR)所提到的,在将响应发送到客户端(并作为请求的一部分接收回来)之前,您的程序无法访问 cookie。您唯一的选择是“记住”您已在响应生成中设置的 cookie。

标签: java cookies response session-cookies


【解决方案1】:

首页是正确的。

我围绕HttpServletResponseWrapper 创建了一个包装器,并将cookie 存储在addCookie 方法中。

然后我在添加另一个之前检查列表中是否存在这些 cookie。

感谢您的帮助。

【讨论】:

    【解决方案2】:

    您可以检查“Set-Cookie”标头是否已包含此类 cookie。

    public static void addCookieIfNotExists(Cookie cookie, HttpServletResponse response) {
        boolean exists = response.getHeaders("Set-Cookie").stream()
                .noneMatch(cookieValue -> cookieValue.startsWith(cookie.getName() + "="));
    
        if (!exists) {
            response.addCookie(cookie);
        }
    }
    
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-11-22
      • 2013-04-05
      • 2018-02-08
      • 2017-07-22
      • 1970-01-01
      • 2013-04-15
      • 2019-07-01
      相关资源
      最近更新 更多