从Servlet响应中删除cookie

41

我想知道如何在Spring MVC中的HttpServletResponse中删除cookie。我有创建cookie的登录方法和希望删除cookie的注销方法,但它不起作用。

以下是代码:

@RequestMapping(method = RequestMethod.POST)
public ModelAndView Login(HttpServletResponse response, String user, String pass) {     
    if (user != null && pass != null && userMapper.Users.get(user).getPass().equals(pass)){
        Cookie cookie = new Cookie("user", user);
        cookie.setPath("/MyApplication");
        cookie.setHttpOnly(true);
        cookie.setMaxAge(3600);
        response.addCookie(cookie);
        Map model = new HashMap();
        model.put("user", user);
        return new ModelAndView("home", "model", model);
    }
    return new ModelAndView("login");
}

@RequestMapping(value="/logout", method = RequestMethod.POST)
public ModelAndView Logout(HttpServletRequest request, HttpServletResponse response) {     

        Cookie[] cookies = request.getCookies();
        for(int i = 0; i< cookies.length ; ++i){
            if(cookies[i].getName().equals("user")){
                //Cookie cookie = new Cookie("user", cookies[i].getValue());
                //cookie.setMaxAge(0);
                //response.addCookie(cookie);
                cookies[i].setMaxAge(0);
                response.addCookie(cookies[i]);
                break;
            }
        } 
        return new ModelAndView("login");
 }

我原本以为只需要更改maxAge就可以了,但是在浏览器中cookie并没有变化。我甚至尝试在注释块中重新编写了一个同名的cookie,但它也不起作用。


你尝试过使用cookie.setvalue("")吗? - Laxman Rana
可能是如何在Java Servlet中删除Cookie的重复问题。 - skaffman
是的,setValue("") 也没有起作用... - Cruz
注释掉的代码使用 new Cookie() 应该可以工作,此外还要设置相同的 cookie 域。 - tbruyelle
2个回答

102

将最大年龄设置为0是正确的。但是,它必须具有完全相同的其他cookie属性,除了值之外。因此,确保域名、路径、安全等完全相同。值是可选的,最好设置为null

因此,考虑到您创建cookie的方式,

Cookie cookie = new Cookie("user", user);
cookie.setPath("/MyApplication");
cookie.setHttpOnly(true);
cookie.setMaxAge(3600);
response.addCookie(cookie);

需要按照以下方式删除it:
Cookie cookie = new Cookie("user", null); // Not necessary, but saves bandwidth.
cookie.setPath("/MyApplication");
cookie.setHttpOnly(true);
cookie.setMaxAge(0); // Don't set to -1 or it will become a session cookie!
response.addCookie(cookie);

话虽如此,但我不确定将已登录用户存储为cookie有什么用处。这样做基本上也允许最终用户操纵其值。相反,最好将其存储为会话属性,并在注销时调用session.invalidate()


谢谢,就这样了。我以后会一直使用这个框架,并且我正在学习它的工作原理。我试图理解如何在这里使用cookies,所以我通过用户登录。 - Cruz
“我不确定将已登录用户存储为cookie有什么用处。” 如果您还链接到单点登录系统并需要通过其存储的cookie永久“注销”用户,则可能相关。 - carlosayam
路径值不正确。我使用"/mywebapp"路径设置了Cookie,然后尝试使用"/"根路径删除它。但是这样做没有起作用,必须使用确切的值cookie.setPath("/mywebapp"),cookie.setMaxAge(0),cookie.setValue(null),response.addCookie(cookie)。 - Whome
也适用于会话cookie吗?那些最初没有设置最大年龄的cookie?还是它们的过期由浏览器控制 - Snackoverflow

-3

无需使用自己的代码。只需配置rememberMeServices bean,该bean将在用户使用记住我选项登录时创建cookie,并在注销后将其删除。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接