Удалить cookie из ответа сервлета
Я хотел бы знать, как удалить cookie в HttpServletResponse
в Spring MVC. У меня есть метод входа в систему, где я создаю файл 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 не меняется. Я даже попытался переписать куки файл с таким же именем в комментарии, но он тоже не работает.
Ответы
Ответ 1
Установка максимального возраста до 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. В основном вы также позволяете enduser манипулировать его значением. Скорее просто сохраните его как атрибут сеанса и вызовите session.invalidate()
при выходе из системы.
Ответ 2
Не нужно использовать свой собственный код. Просто настройте функцию rememberMeServices bean, которая создаст файл cookie, когда пользователь войдет в систему с параметром rememberMe, и удалит его после выхода из системы.