Java 如何在客户端上删除HttpOnly Cookie?

Java 如何在客户端上删除HttpOnly Cookie?,java,reactjs,cookies,jax-rs,cookie-httponly,Java,Reactjs,Cookies,Jax Rs,Cookie Httponly,我有一个网站,当用户登录时,它会创建一个存储在内存中的访问令牌和一个存储在HttpOnly cookie中的刷新令牌。当用户注销时,我想删除HttpOnly cookie。但是,由于它是HttpOnly,我无法使用JavaScript执行此操作,因此我的计划是从服务器发送另一个过期的cookie,并覆盖有效的cookie。不幸的是,由于某些原因,这不起作用 这是我首先创建cookie的方式: String refreshToken = issueRefreshToken(username);

我有一个网站,当用户登录时,它会创建一个存储在内存中的访问令牌和一个存储在HttpOnly cookie中的刷新令牌。当用户注销时,我想删除HttpOnly cookie。但是,由于它是HttpOnly,我无法使用JavaScript执行此操作,因此我的计划是从服务器发送另一个过期的cookie,并覆盖有效的cookie。不幸的是,由于某些原因,这不起作用

这是我首先创建cookie的方式:

 String refreshToken = issueRefreshToken(username);
 long currentDate = Calendar.getInstance().getTimeInMillis();
 Date expDate = new Date(currentDate + 60 * 24 * 7 * ONE_MINUTE_IN_MILLIS);

 NewCookie newCookie = new NewCookie("RefreshCookie",
                    refreshToken,
                    "/",
                    null,
                    NewCookie.DEFAULT_VERSION,
                    "Comment",
                    60 * 60 * 24 * 7,
                    expDate,
                    false,
                    true);

            // Return the token  on the response
 return Response.ok(accessToken).cookie(newCookie).header("Access-Control-Allow-Credentials", true).build();

这将按预期工作,并创建一个有效期为一周的刷新cookie

我有另一个端点(/logout),该端点创建另一个cookie,该cookie将覆盖第一个cookie

 @POST
 public Response logout(){
        NewCookie logoutCookie = new NewCookie(
                "RefreshCookie",
                null,
                "/",
                null,
                NewCookie.DEFAULT_VERSION,
                "",
                0,
                new Date(),
                false,
                true);
        return Response.ok().cookie(logoutCookie).header("Access-Control-Allow-Credentials", true).build();
    }

当未设置第一个客户端时,此cookie甚至不会保存到前端。我尝试从设置第一个cookie的子路径发送它,但运气不佳。这里有我遗漏的东西吗?这是一种错误的做法吗?

根据您的说法,您使用的是httpOnly cookie,因此您必须了解,从客户端来看,您无法实现这一点,因为这样做会破坏使用httpOnly cookie的目的,而不是与使用常规cookie一样

  • 因此,现在,当用户注销时,您的解决方案是在您的后端删除cookie,我相信制作cookie的地方就是您希望删除特定cookie的地方

从您所说的内容来看,您使用的是httpOnly cookie,因此您必须了解,从客户端来看,您无法实现这一点,因为这样做会破坏使用httpOnly cookie的目的,而不是与使用常规cookie一样

  • 因此,现在,当用户注销时,您的解决方案是在您的后端删除cookie,我相信制作cookie的地方就是您希望删除特定cookie的地方

没错!然而,据我所知,实现这一点的唯一方法是用即将过期的新cookie覆盖第一个cookie。问题是,这对我不起作用,因为cookie没有保存或覆盖,我不知道为什么会这样。你可以通读我曾经给出的关于需要服务器端会话的人的示例。会话都保存在mongoStore中,这样你就可以轻松地处理类似的事情,而这正是我处理express sessions的方式!然而,据我所知,实现这一点的唯一方法是用即将过期的新cookie覆盖第一个cookie。问题是,这对我来说不起作用,因为cookie没有保存或覆盖,我不知道为什么会这样。你可以通读我曾经给出的关于需要服务器端会话的人的示例。会话都保存在mongoStore中,这样你就可以轻松地处理类似的事情,这就是我处理express会话的方式