用Java管理会话cookie

时间:2015-04-16 14:18:23

标签: java session cookies

我正在使用java Web应用程序,该应用程序不允许用户在2个不同的选项卡中打开它,我正在使用会话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工具

2 个答案:

答案 0 :(得分:1)

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

也就是说,这应该是默认值,因此为了解决问题,您应该使用Firebug(或任何浏览器开发人员工具)检查您的Cookie并检查其最大年龄。关闭浏览器之前和之后。例如。你可能有一些剩余的饼干。

答案 1 :(得分:1)

实际上你应该以不同的方式设置cookie:

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);

中指定的名称