session.invalidate () на самом деле не очищает значения области JSF-сессии - PullRequest
2 голосов
/ 03 февраля 2011

Я вижу похожую проблему, упомянутую в этом вопросе - https://stackoverflow.com/questions/1495390/how-do-i-invalidate-a-session-in-jsf.

У меня есть LoginBean в области сеанса, в котором действие завершено как #

    ExternalContext ec = FacesContext.getCurrentInstance().getExternalContext();
    HttpSession session = (HttpSession) ec.getSession(false);
    HttpServletResponse response = (HttpServletResponse) ec.getResponse();

    // remove cookies
    response.addCookie(facade.removeCookie(((HttpServletRequest)ec.getRequest()).getCookies()));
    // check what we have in sessionMap
    System.out.println(ec.getSessionMap());
    // remove attribute
    session.removeAttribute("XYZ");

    // invalidate session
    if (session != null) {
        System.out.println("invalidating session");
        session.invalidate();
    }
    // see what is there in session map
    System.out.println(ec.getSessionMap());

Почти нормально работает.

Вывод #

{xyzBean=com.xyz.bean.XYZBean@46f046f0,... }
invalidating session
{}

Сессионная карта пуста, это означает, что отсутствуют бины области действия сеанса. Однако после выхода из системы он перенаправляет на другую страницу. Логин является слоем на той же странице. Я вижу, что фрагмент jsps все еще показывает старые данные.

Я не удаляю JSESSIONID в файле фасад. Удаляет некоторые другие файлы cookie, связанные с пользователем.

Любая помощь будет принята с благодарностью.

Спасибо.

1 Ответ

2 голосов
/ 03 февраля 2011

Вы, вероятно, просматриваете страницу, которая обслуживается из кэша браузера.Вам необходимо добавить заголовки HTTP-ответа, которые инструктируют веб-браузеру не кэшировать динамические страницы.Вы можете сделать это с javax.servlet.Filter, который сопоставлен с <url-pattern> интересами, например, *.jsf или чем-то еще, и выполняет следующую методику в doFilter() методе:

HttpServletResponse httpResponse = (HttpServletResponse) response;
httpResponse.setHeader("Cache-Control", "no-cache,no-store,must-revalidate"); // HTTP 1.1
httpResponse.setHeader("Pragma", "no-cache"); // HTTP 1.0
httpResponse.setDateHeader("Expires", 0); // Proxies.
chain.doFilter(request, response);

Не забудьтеочистить кеш браузера перед тестированием;)


Не связанная с проблемой, проверка на нуль if (session != null) в вашем коде является излишней, поскольку сессия никогда не может быть нулевой, когда она достигает этой проверки на нуль.Если бы он был нулевым, он бросил бы NullPointerException при вызове removeAttribute() и, таким образом, никогда не достиг бы нулевой проверки.

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