Удалить куки из ответа сервлета - PullRequest
24 голосов
/ 22 марта 2012

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

Ответы [ 2 ]

74 голосов
/ 22 марта 2012

Правильно установить максимальный возраст 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 голосов
/ 22 августа 2012

Нет необходимости использовать свой собственный код. Просто сконфигурируйте bean-компонент RememberMeServices, который будет создавать cookie при входе пользователя с установленным параметром RememberMe и удалять его после выхода из системы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...