2012-03-22 48 views
21

我想知道如何在Spring MVC中删除HttpServletResponse中的cookie。我有创建cookie的登录方法和我想要删除它的注销,但它不起作用。从servlet响应中删除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,但它也不起作用。

+0

你试过cookie.setvalue(“”)? – 2012-03-22 12:21:30

+0

[您如何在Java Servlet中删除Cookie]的可能重复(http://stackoverflow.com/questions/890935/how-do-you-remove-a-cookie-in-a-java-servlet) – skaffman 2012-03-22 12:34:12

+0

是的,setValue(“”)也没有工作...... – Cruz 2012-03-22 13:15:28

回答

60

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

所以,给你如何创建的cookie,

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

需要如下要删除的方式:

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

+0

谢谢,就是这样,从现在开始我将使用这个框架,我只是在学习它是如何工作的,我试图理解在这里使用cookie,这就是为什么我通过用户进行登录。 – Cruz 2012-03-23 10:09:59

+0

“我不确定将登录用户作为cookie存储有何用处。”如果您也链接到单点登录系统并且需要通过其存放的cookie永久“登出”用户,可能也是相关的。 – carlosayam 2012-07-03 01:50:03

+0

路径值是它。我使用“/ mywebapp”路径设置cookie,然后尝试使用“/”根路径删除它。它没有工作,但必须使用确切的值cookie.setPath(“/ mywebapp”),cookie.setMaxAge(0),cookie.setValue(null),response.addCookie(cookie) – Whome 2013-05-14 11:00:10

-1

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