Spring MVC: как удалить атрибут сеанса?

Пример использования @SessionAttributes ниже. Как очистить атрибут сеанса user после завершения работы мастера? В моем примере после возврата в /wizard0 атрибут сеанса все еще существует. Я пробовал status.setComplete() и session.removeAttribute("user"), но это не работает.

@Controller
@SessionAttributes("user")
public class UserWizard {

    @RequestMapping(value = "/wizard0", method = RequestMethod.GET)
    public String page1(Model model) {
        if(!model.containsAttribute("user")) {
            model.addAttribute("user", new User());
        }
        return "wizard/page1";
    }

    @RequestMapping(value = "/wizard1", method = RequestMethod.GET)
    public String page2(@ModelAttribute User user) {
        user.setFirstname(Utils.randomString());
        return "wizard/page2";
    }

    @RequestMapping(value = "/wizard2", method = RequestMethod.GET)
    public String page3(@ModelAttribute User user) {
        user.setLastname(Utils.randomString());
        return "wizard/page3";
    }

    @RequestMapping(value = "/finish", method = RequestMethod.GET)
    public String page4(@ModelAttribute User user, HttpSession session, SessionStatus status) {
        /**
         * store User ...
         */
        status.setComplete();
        session.removeAttribute("user");
        return "redirect:/home";
    }

}

ИЗМЕНИТЬ

Виноват. status.setComplete(); работает хорошо. session.removeAttribute("user") здесь делать нечего.


person marioosh    schedule 13.08.2013    source источник
comment
status.setComplete(); должен очистить ваш SessionAttribute. Возможно, вы настраиваете пользователя в другом классе или это какая-то проблема с конфигурацией сеанса...   -  person Deividi Cavarzan    schedule 13.08.2013
comment
Вы подтвердили, что сеанс содержит тот же пользовательский объект, который вы добавили? проверьте хэш-код пользовательского объекта после и перед его удалением из сеанса frm   -  person coder    schedule 13.08.2013
comment
Извините. Моя ошибка. Однако status.setComplete() работает хорошо. У меня кнопка "Готово" отображается неправильно - метод page4 вообще не вызывался, так что это была проблема. Я увидел, что session.removeAttribute("user") / HttpSession не имеет ничего общего с @SessionAttributes. Вопрос закрыть/удалить/и т.д... Извините еще раз.   -  person marioosh    schedule 14.08.2013


Ответы (2)


Попробуйте использовать метод WebRequest.removeAttribute вместо метода HttpSession.setAttribute (пример 1). Или другим способом, который делает то же самое, вы можете использовать «SessionAttributeStore.cleanupAttribute» (пример 2).

ПРИМЕР 1

@RequestMapping(value = "/finish", method = RequestMethod.GET)
public String page4(@ModelAttribute User user, WebRequest request, SessionStatus status) {
    /**
     * store User ...
     */
    status.setComplete();
    request.removeAttribute("user", WebRequest.SCOPE_SESSION);
    return "redirect:/home";
}

ПРИМЕР 2

@RequestMapping(value = "/finish", method = RequestMethod.GET)
public String page4(@ModelAttribute User user, WebRequest request, SessionAttributeStore store, SessionStatus status) {
    /**
     * store User ...
     */
    status.setComplete();
    store.cleanupAttribute(request, "user");
    return "redirect:/home";
}
person michal.kreuzman    schedule 15.08.2013
comment
Как создать экземпляр SessionAttributeStore, потому что у меня есть ожидание: Could not instantiate bean class [org.springframework.web.bind.support.SessionAttributeStore]: Specified class is an interface. - person Anton Dozortsev; 23.04.2014
comment
Как очистить все атрибуты сеанса за один раз? - person Amit Kumar; 11.10.2015

Ниже работало для меня -

@RequestMapping(value = "/finish", method = RequestMethod.GET)
public String page4(HttpSession httpsession, SessionStatus status) {

/*Mark the current handler's session processing as complete, allowing for cleanup of 
  session attributes.*/
status.setComplete();

/* Invalidates this session then unbinds any objects boundto it. */
httpsession.invalidate();
return "redirect:/home";
}
person abhijeet badale    schedule 01.01.2020