Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java EE (J2EE) и Spring > отработка sendRedirect (primefaces)


Автор: madjaheda 28.12.2015, 17:41
Всем доброго времени суток. Столкнулся с непонятным поведением кода. Речь идет о фильтрах в primefaces. Дело в том что просмотрев много разной информации в просторах интернета решил выполнить задачу именно с помощью них. Нужно просто отловить закрытие сессии и сделать редирект на определенную страницу. Вот мой класс-фильтр
Код

public class SessionTimeoutFilter implements Filter{
    private boolean firstCheck = true;
    //private String timeoutPage = "timeout.xhtml";
    private String timeoutPage = "https://www.google.com.ua";
 
     public void init(FilterConfig filterConfig) throws ServletException {
     }
 
    public void doFilter(ServletRequest request, ServletResponse response,
            FilterChain filterChain) throws IOException, ServletException {
 
        if ((request instanceof HttpServletRequest) && (response instanceof HttpServletResponse)) {
            HttpServletRequest httpServletRequest = (HttpServletRequest) request;
            HttpServletResponse httpServletResponse = (HttpServletResponse) response;
             if (isSessionControlRequiredForThisResource(httpServletRequest)) {
                if (isSessionInvalid(httpServletRequest)) {
                    httpServletResponse.sendRedirect("/timeout.xhtml");                 
                    firstCheck = true;
                    return;
                }
            }
        }
        filterChain.doFilter(request, response);
    }
 
     private boolean isSessionControlRequiredForThisResource(HttpServletRequest httpServletRequest) {
      String requestPath = httpServletRequest.getRequestURI();
      boolean controlRequired = !requestPath.contains(getTimeoutPage());
      return controlRequired;
     }
 
     private boolean isSessionInvalid(HttpServletRequest httpServletRequest) {
      boolean sessionInvalid = (httpServletRequest.getRequestedSessionId() != null)
                && !httpServletRequest.isRequestedSessionIdValid();
      
      if(firstCheck)
          if(httpServletRequest.getSession().isNew()){
              sessionInvalid = false;
              firstCheck = false;
          }
              return sessionInvalid;
     }
 
     public void destroy() {
     }
 
     public String getTimeoutPage() {
      return timeoutPage;
     }
 
     public void setTimeoutPage(String timeoutPage) {
      this.timeoutPage = timeoutPage;
     }
     
    }

И дело в том, что именно когда нужные условия выполняются и должен происходить редирект, то метод как таковой вызывается (видно через дебаггер), а по сути редирект не происходит. Эксперимента ради вызывал метод sendRedirect до проверок и все работало. Фильтр ловил реквест и сходу же направлял меня на нужную страницу.
Видать дело в том что когда сессия истекает, то и редирект не срабатывает. На форумах пишут что должно работать, а по факту нет =( Подскажите, пожалуйста, в чем может быть проблема. Вот на всякий случай как я указал фильтр в xml
Код

<filter>
        <filter-name>SessionTimeoutFilter</filter-name>
        <filter-class>ua.obriy.controller.general.SessionTimeoutFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>SessionTimeoutFilter</filter-name>
        <url-pattern>*.xhtml</url-pattern>
    </filter-mapping>

Заранее благодарен.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)