Как переместить пользователя на страницу тайм-аута по истечении сеанса, если пользователь нажимает кнопку возврата браузера - PullRequest
3 голосов
/ 19 марта 2012

Я обрабатываю истечение сеанса в JSF 2.0, используя фильтр.Вот код

  @Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain filterChain)
        throws IOException, ServletException {

    HttpServletRequest httpServletRequest = (HttpServletRequest) request;
    HttpServletResponse httpServletResponse = (HttpServletResponse) response;

    HttpSession session = httpServletRequest.getSession(false);

    if (session == null) {

        //session timeout check.
        if (httpServletRequest.getRequestedSessionId() != null && !httpServletRequest.isRequestedSessionIdValid()) {

            System.out.println("Session has expired");
            session = httpServletRequest.getSession(true);
            session.setAttribute("logedin", "0");    // public user               
            httpServletResponse.sendRedirect(timeoutPage);

        } else {

            session = httpServletRequest.getSession(true);
            session.setAttribute("logedin", "0");
            filterChain.doFilter(httpServletRequest, httpServletResponse);
        }
    } 
} //end of doFilter()

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

Еще одна вещь, что я также использую компонент Prime Faces на своей странице, например, для данных.Я использую нумерацию страниц.Если время сеанса истекло, и я нажимаю на нумерацию страниц, сообщение об окончании сеанса не отображается.Кажется, что запрос ajax не вызывает фильтр?Как я могу связать свои события ajax, или вы можете сказать датируемые события нумерации страниц с истечением срока сессии?

Спасибо

1 Ответ

5 голосов
/ 19 марта 2012

, когда сессия заканчивается, и если пользователь нажимает кнопку "Назад", он получает страницу со всеми стилями

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

Добавьте следующие строки прямо перед filterChain.doFilter() вызовом.

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

Если сеанстайм-аут, и я нажимаю на нумерацию страниц, после чего сообщение об окончании сеанса не появляется.Кажется, что ajax-запрос не вызывает фильтра?

JSF-ajax-запросы ожидают XML-ответов с HTTP-статусом 200. Если вы отправляете синхронное перенаправление, то HTTP-статус 302 будет отправленкоторый будет полностью игнорироваться движком JSF ajax.Вместо этого вы должны отправлять нормальный ответ HTTP 200 с определенным фрагментом XML, который указывает движку JSF ajax выполнить перенаправление.Сделайте это вместо httpServletResponse.sendRedirect(), затем:

if ("partial/ajax".equals(httpServletRequest.getHeader("Faces-Request"))) {
    httpServletResponse.setContentType("text/xml");
    httpServletResponse.getWriter()
        .append("<?xml version=\"1.0\" encoding=\"UTF-8\"?>")
        .printf("<partial-response><redirect url=\"%s\"></redirect></partial-response>", timeoutPage);
}
else {
    httpServletResponse.sendRedirect(timeoutPage);
}

Обратите внимание, что когда вы уже находитесь в контексте JSF (например, PhaseListener или SystemEventListener или, возможно, @ManagedBean), тогда вы можете простоиспользуйте метод ExternalContext#redirect().Соответственно, он будет прозрачно обрабатывать синхронные / асинхронные запросы.

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