【问题标题】:Managing session cookies in Java在 Java 中管理会话 cookie
【发布时间】:2015-04-16 23:33:25
【问题描述】:

我正在使用一个不允许用户在 2 个不同选项卡中打开它的 Java Web 应用程序,为此我正在使用会话 cookie。在大多数情况下似乎都可以正常工作,但问题是浏览器退出时没有清除 cookie。这就是我设置 cookie 的方式:

String sCookie = "mycookie=true;Path=/;Domain=.mydomain.com;HttpOnly";
        if (!response.containsHeader("Set-Cookie")) {
            response.setHeader("Set-Cookie", sCookie);
        } else {
            response.addHeader("Set-Cookie", sCookie);
        }

据我了解,如果我不指定 Expires 字段,则应在浏览器关闭时删除 cookie。这就是我验证 cookie 是否存在的方式:

Cookie[] cookies = request.getCookies();
        for (Cookie cookie : cookies) {
            if ("mycookie".equals(cookie.getName()) && Boolean.valueOf(cookie.getValue())) {//some error}}

这段代码有问题吗?意思是,我可以用response.setHeader 设置cookie,然后用request.getCookies() 进行检查吗? 有时我在手动删除 cookie 时遇到问题,然后当我重新启动浏览器时问题仍然存在。

这就是我手动删除 cookie 的方式(在标签关闭时):

String sCookie = "mycookie=;Path=/;Domain=.mydomain.com;HttpOnly";
        if (!response.containsHeader("Set-Cookie")) {
            response.setHeader("Set-Cookie", sCookie);
        } else {
            response.addHeader("Set-Cookie", sCookie);
        }

提前致谢
更新
这就是我创建 cookie 的方式:

Cookie c = new Cookie("mycookie","true");
        c.setDomain(".mydomain.com");
        c.setPath("/");
        c.setValue("true");
        response.addCookie(c);


这就是我删除 cookie 的方式:

for (Cookie c : request.getCookies()) {
            if ("mycookie".equals(c.getName())) {
                c.setMaxAge(0);
                c.setValue("");
            }
        }


但仍然无法正常工作。实际上,现在当我关闭选项卡时 cookie 没有被删除(这在我以前的版本中使用“Set-Cookie”:S 运行良好)。另一个细节是我在 Chrome 开发人员的资源选项卡中没有看到我的 cookie工具

【问题讨论】:

  • 你在使用 Chrome 吗?
  • 嗨 @MauricePerry,是的,我正在使用 Chrome、Internet Explorer 10 和 Firefox 进行测试
  • 这里有一个帖子可能会有所帮助:stackoverflow.com/questions/10617954/…
  • 你试过c.setDomain("");吗?
  • mmm 不应与创建@JordiCastilla 中指定的域相同?

标签: java session cookies


【解决方案1】:

作为一般提示,您最好使用response.addCookie(..) 方法并可能使用Cookie.setMaxAge(-1)

也就是说,这应该是默认设置,因此为了了解问题所在,您应该使用 Firebug(或任何浏览器开发工具)检查您的 cookie 并检查它们的最大使用期限。关闭浏览器之前和之后。例如。你可能有一些剩余的饼干。

【讨论】:

  • 感谢@Bozho 的回答,我已经尝试过使用Cookie 对象但没有成功,这就是我使用response.setHeader 实现的原因。关于 cookie,我可以在 Firebug 中看到它并标记为 Session(Expires/Max-age 选项卡)
【解决方案2】:

其实你应该用不同的方式设置cookies:

Cookie myCookie = new Cookie();  // create your cookie
// set path, and other attributes you need

// add the cookie to the response
response.addCookie(myCookie);

然后使Cookie过期::

myCookie.setMaxAge(0);

另外,为了彻底清洁:

myCookie.setValue("");
myCookie.setPath("/");

因此,您必须获取请求中的所有 cookie,识别您的并使用以下内容进行清理:

List<Cookie> cookies = request.getCookies();

for (Cookie cookie : cookies) {
    // identify your cookie
    if (identified) {
        cookie.setMaxAge(0);
        cookie.setValue("");
        cookie.setPath("/");
    }
}

如果cookie.getName("Set-Cookie") 与您的Cookie 不匹配,请调试您的代码以查看response.setHeader("Set-Cookie", sCookie); 中分配的名称

【讨论】:

  • 感谢@JordiCastilla,正如我向 Bozho 提到的,我已经尝试过此设置,但没有成功。我是否将这些东西与我的代码混合在一起?我的意思是,除了你的建议,如果我用 response.setHeader 设置并用 request.getCookies 检查有什么问题吗?
  • 这就是我检查 cookie @JordiCastilla 的方式,但显然无法正常工作。在一些测试中,我被堆叠了,我无法打开一个新标签,所以如果 cookie 真的在会话中,那么问题应该只是重新启动浏览器就可以解决,但事实并非如此,我再次打开浏览器并且 cookie 仍然存在跨度>
猜你喜欢
  • 2012-02-09
  • 2020-11-03
  • 2017-01-07
  • 2014-08-05
  • 1970-01-01
  • 1970-01-01
  • 2010-11-26
  • 2011-04-03
  • 1970-01-01
相关资源
最近更新 更多