【问题标题】:How to delete a cookie on server with JAX-RS NewCookie?如何使用 JAX-RS NewCookie 删除服务器上的 cookie?
【发布时间】:2011-12-26 04:27:07
【问题描述】:

我想删除服务器上的 cookie(通过将 Expires 设置为过去)。我怎样才能用javax.ws.rs.core.NewCookie 做到这一点?我正在尝试这个,但它不起作用:

return Response.ok()
  .entity("hello world!")
  .cookie(
    new NewCookie(
      "foo",
      "",
      "/",
      ".example.com",
      1,
      "no comment",
      0, // maxAge
      false
    )
  )
  .build();

这个 sn-p 产生这个 HTTP 头:

Set-Cookie:foo=;Version=1;Comment="no comment";Domain=.example.com;Path=/

此标头不会从服务器中删除 cookie。什么是可能的解决方法?

【问题讨论】:

  • 不是重复的,因为这个问题专门询问如何使用 JAX-RS NewCookie 来做到这一点,而另一个问题要求使用一般的 HTTP 方法。

标签: java http cookies jax-rs


【解决方案1】:

我无法尝试建议,但它应该可以工作(因为 java servlet API 删除 cookie 是常见的解决方法)。

步骤 1. 访问 HttpServletResponse。为此,请在您的服务中声明:

@Context
HttpServletResponse _currentResponse;

Step 2. 让客户端有机会通过设置过期时间来移除cookie

Cookie userCookie = new Cookie(cookieName, "");
_currentResponse.setContentType("text/html");
userCookie.setMaxAge(0);
_currentResponse.addCookie(userCookie);

【讨论】:

  • 这不起作用 b/c 只有当其 Expires 字段设置为过去的日期时,cookie 才会被删除
  • @Oleg - 所以你建议添加行来分配 cookie 日期?
  • 对不起,请忽略,我不知道 setMaxAge(0) 真的会产生Expires=Thu, 01-Jan-1970 00:00:10 GMT
  • @OlegMikheev 真的这样做吗?我在泽西岛找不到这种转换发生的地方。
  • @GuiSim 我个人见过 cookie.setMaxAge 的不同行为,我想答案是特定于实现的
【解决方案2】:

这就是它的工作原理(相当肮脏的方法):

return Response.ok()
  .header(
    "Set-Cookie",
    "foo=deleted;Domain=.example.com;Path=/;Expires=Thu, 01-Jan-1970 00:00:01 GMT"
  );

【讨论】:

  • 抱歉,此响应没有删除或更改 cookie:Response.ok() .header( "Set-Cookie", "foo=deleted;Expires=Thu, 01-Jan-1970 00:00 :01 GMT");
  • 对于 cookie:name = "foo" value = "..." comment = null domain = null maxAge = -1 path = null secure = false version = 0 isHttpOnly = false
【解决方案3】:

这对我有用!请注意,我将最大年龄设置为 0,并将到期日期设置为当前时间。

NewCookie mycookie= new NewCookie("mycookie", null, "/", "", NewCookie.DEFAULT_VERSION, null, 0, new Date(), false, false);
return Response.ok().cookie(mycookie).build();

【讨论】:

    【解决方案4】:

    这也可以:

    NewCookie mycookie = new NewCookie("mycookie", null, "/", null, null, 0, false, true);
    return Response.ok().cookie(mycookie).build();
    

    从响应头中提取:

    set-cookie: mycookie=;Version=1;Path=/;Max-Age=0;HttpOnly
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-06-16
      • 1970-01-01
      • 2014-05-16
      • 2013-06-26
      • 1970-01-01
      • 2013-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多