Страницы JSF Logout и Expire

Я использовал приведенный ниже алгоритм выхода из системы в своем приложении JSF, и он работает, поскольку пользователь может выйти из системы, а сеанс завершается.

Однако моя проблема заключается в том, что даже если пользователь перенаправляется на страницу входа в систему, но когда он нажимает кнопку «Назад» в браузере, он все равно может видеть предыдущие данные.

@ManagedBean
@RequestScoped
public class LogoutBean {
  public String logout() {
    String result="/faces/pages/public/login.xhtml?faces-redirect=true";

    FacesContext context = FacesContext.getCurrentInstance();
    HttpServletRequest request = (HttpServletRequest)context.getExternalContext().getRequest();

    try {
      request.logout();
    } catch (ServletException e) {
        log.info("Error during logout!");
    }
    return result;
  }
}

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


person Mark Estrada    schedule 07.11.2012    source источник
comment
возможный дубликат Избегайте кнопки "Назад" в приложении JSF+Primefaces   -  person BalusC    schedule 08.11.2012
comment
ooppss извините за возможный дубликат...   -  person Mark Estrada    schedule 08.11.2012


Ответы (1)


Вы должны отключить кеш браузера для страниц, которые вы не хотите, чтобы кнопка «Назад» показывала их снова. Для этого вы можете создать фильтр сервлета, который устанавливает необходимые параметры в заголовке ответа для этих страниц:

@WebFilter(servletNames={"Faces Servlet"})
public class NoCacheFilter implements Filter {

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        HttpServletRequest req = (HttpServletRequest) request;
        HttpServletResponse res = (HttpServletResponse) response;

        if (!req.getRequestURI().startsWith(req.getContextPath() + ResourceHandler.RESOURCE_IDENTIFIER)) { // Skip JSF resources (CSS/JS/Images/etc)
            res.setHeader("Cache-Control", "no-cache, no-store, must-revalidate"); // HTTP 1.1.
            res.setHeader("Pragma", "no-cache"); // HTTP 1.0.
            res.setDateHeader("Expires", 0); // Proxies.
        }

        chain.doFilter(request, response);
    }

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
    }

    @Override
    public void destroy() {
    }
}

Таким образом, когда пользователи нажимают кнопку «Назад» в браузере, страница будет снова запрашиваться с сервера.

person Mohammad Dehghan    schedule 07.11.2012