Java 关于Cookie的蛋疼问题

最近让做一个自动登录的功能,于是google,学习了下他人的代码,感觉不是很难;但还是遇到了一些小挫折,很叫人蛋疼!也没法搞定了,只能发帖呼救了~

我所实现的自动登录功能也就三步:

①在登录方法的判断密码的if分支中,创建cookie如下:

 

 

Cookie cookie = new Cookie("usr", username);
cookie.setMaxAge(24*60*60*15);
response.addCookie(cookie);
Cookie cookie = new Cookie("pw", pwEncrypt);
cookie.setMaxAge(24*60*60*15);
response.addCookie(cookie);

 ②在访问首页的方法中,搜索cookie如下:

 

 

String username = "";
String password = "";
Cookie[] cookies = request.getCookies();
if (cookies != null) {
    for (Cookie cookie : cookies) {
        if ("usr".equals(cookie.getName())) {
            username = cookie.getValue();
        }
        if ("pw".equals(cookie.getName())) {
            password = cookie.getValue();
        }
        if (!"".equals(username) && !"".equals(password)) {
            //将用户对象放入session中
        }
    }
}

 ③退出方法中,删除cookie如下:

 

 

Cookie[] cookies = request.getCookies();
if (cookies != null) {
    for (Cookie cookie : cookies) {
        if ("urs".equals(cookie.getName())) {
            cookie.setValue("");
            cookie.setMaxAge(0);
            response.addCookie(cookie);
        }
        if ("pw".equals(cookie.getName())) {
            cookie.setValue("");
            cookie.setMaxAge(0);
            response.addCookie(cookie);
        }
    }
}

 

其中,①②步都木问题,问题就出在第③步,无论怎样都无法删除cookie(最后也只能在ie的Internet选项中删了)。点击“退出”按钮时,关闭浏览器,再打开,首页依然显示该用户为登录状态,很是纠结!!是代码问题,还是我浏览器设置问题?或者是其他什么原因?

 

6个回答

[quote]一、删除已知名称的Cookie(方案:重新建立同名立即删除类型的Cookie)

Cookie newCookie=new Cookie(“username”,null); //假如要删除名称为username的Cookie

newCookie.setMaxAge(0); //立即删除型

newCookie.setPath(“/”); //项目所有目录均有效,这句很关键,否则不敢保证删除

response.addCookie(newCookie); //重新写入,将覆盖之前的

  二、删除所有Cookie

Cookie[] cookies=request.getCookies();

for(Cookie cookie: cookies){

cookie.setMaxAge(0);

cookie.setPath(“/”);

response.addCookie(cookie);

}
[/quote]

iteye_8786
iteye_8786 cookie.setPath("/")果然很关键,加上了这句后问题就解决了。不过我还是有个疑问,我第①步的时候并没有加上这一句,为什么第③步的时候需要加上这一句?这两处应该是对应起来的吧?
大约 7 年之前 回复

1、你删cookie的方式没问题
2、你是不是应该调用session.invalidate 销毁session,因为
String username = "";
String password = "";
Cookie[] cookies = request.getCookies();
if (cookies != null) {
for (Cookie cookie : cookies) {
if ("usr".equals(cookie.getName())) {
username = cookie.getValue();
}
if ("pw".equals(cookie.getName())) {
password = cookie.getValue();
}
if (!"".equals(username) && !"".equals(password)) {
//将用户对象放入session中
}
}
}

你这段代码是查用户放到session 怀疑你又根据session中的数据判断用户是否登录

iteye_8786
iteye_8786 嘿嘿,这是我第一次用,以前压根儿就没用过^_^要不然也不会这么的费劲~多谢你的不厌其烦!但,还是只能选他人为最佳了~
大约 7 年之前 回复
jinnianshilongnian
jinnianshilongnian 嗯 估计之前你也是这么用的吧,,path默认当前路径。。竟然是这出的问题 没想到
大约 7 年之前 回复
iteye_8786
iteye_8786 确实跟session无关了,我在第③步中加上了cookie.setPath("/"),问题就得到了解决~
大约 7 年之前 回复
jinnianshilongnian
jinnianshilongnian 估计就是isession处理有问题,你再检查下session的操作
大约 7 年之前 回复
iteye_8786
iteye_8786 原来是点了“退出”后,cookie依然在!好像就没有走第③步一样!但我Debug了,确实走了呀~依旧郁闷中……
大约 7 年之前 回复
jinnianshilongnian
jinnianshilongnian 1、建议你写个filter看看 2、建议使用chrome 查看cookie来回传的情况 (看看cookie销毁了吗 如果销毁了 就是session的问题了)
大约 7 年之前 回复
iteye_8786
iteye_8786 我在退出方法中将session.removeAttribute("UserDto")改为了session.invalidate(),结果还是不行啊,依旧打开浏览器时,用户为登录状态!_!但有一点可疑的是,我这儿用了两次session.setAttribute("UserDto",userDto),一次是在异步请求的方法中,若密码判断成功时set了一下;第二次是用户登录成功后跳到首页,而调用首页的方法中进行了cookie判断,所以,若密码判断成功时,又进行了一次set操作。这个应该不会影响吧?还有一点,我前台jsp页面中确实是通过session来判断用户是否登录的。
大约 7 年之前 回复

[code="java"] for (Cookie cookie : cookies) {

if ("urs".equals(cookie.getName())) {

//cookie.setValue(""); // 注释掉
cookie.setMaxAge(0);

response.addCookie(cookie);

}

if ("pw".equals(cookie.getName())) {

//cookie.setValue(""); // 注释掉

        cookie.setMaxAge(0);   
        response.addCookie(cookie);   
    }   
}   [/code]
iteye_8786
iteye_8786 兄弟,如果照你的做的话,我的“退出”按钮就没法点了,点了还是登录状态,点了还是登录状态,点了还是登录状态……………………
大约 7 年之前 回复

删除cookie的程序是没有问题的,估计是你每次登陆的时候并不是检测cookie中是否存在改用户,可能是检测session了,你可以每次退出登陆是将session销毁试试

[quote]
点击“退出”按钮时,关闭浏览器,再打开,首页依然显示该用户为登录状
[/quote]
要确认一下客户端是否接收到了删除cookie的命令,用firebug看看点击退出时,浏览器接收到的response中有没有set cookie指令

第一:注销时要session.invalidate()。
第二:不应该在进入首页时检查,而应该在进入任何页面(登录页除外)都检查。
第三:有可能是IE的缓存问题,你在页面源代码中加入禁用缓存的代码试试。

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问