2012-03-22 4 views
21

Я хотел бы знать, как удалить cookie в HttpServletResponse в Spring MVC. У меня есть метод входа в систему, где я создаю файл 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, но в браузере куки не изменяются. Я даже попытался переписать куки-файл с таким же именем в комментариях, но он тоже не работает.

+0

есть ли у вас cookie.setvalue ("") ?? –

+0

Возможный дубликат [Как удалить куки-файл в Java-сервлете] (http://stackoverflow.com/questions/890935/how-do-you-remove-a-cookie-in-a-java-servlet) – skaffman

+0

да, setValue ("") тоже не работал ... – Cruz

ответ

60

Максимальный возраст до 0 является правильным. Но он должен иметь точно те же свойства cookie, кроме значения. Таким образом, точно такой же домен, путь, безопасный и т. Д. Значение не является обязательным, его лучше всего установить на null.

Таким образом, учитывая то, как вы создали печенье,

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. В основном вы также позволяете enduser манипулировать его значением. Скорее просто сохраните его как атрибут сеанса и вызовите session.invalidate() при выходе из системы.

+0

Спасибо, все, хорошо, я буду работать с этой картой с этого момента, и я просто изучаю, как это работает, и я пытался понять, как использовать куки здесь, поэтому я сделал логин через пользователя. – Cruz

+0

«Я не уверен, как полезно хранить зарегистрированного пользователя как cookie». Возможно, это актуально, если вы также связаны с системой единого входа и должны постоянно «выходить из системы» через свой депонированный файл cookie. – carlosayam

+0

Значение пути было. Я установил файл cookie с «/ mywebapp», а затем попытался удалить его с корневым путем «/». Это не сработало, но нужно было использовать точные значения cookie.setPath ("/ mywebapp"), cookie.setMaxAge (0), cookie.setValue (null), response.addCookie (cookie) – Whome

-1

Не нужно использовать свой собственный код. Просто настройте компонент rememberMeServices, который будет создавать cookie, пока пользователь выполнит вход с параметром rememberMe, и удалит его после выхода из системы.

Смежные вопросы