2016-03-04 1 views
1

Omnifaces 2,0, Primefaces 5, wildFly 8,2запроса Ajax после тайм-аут сеанса показывает <частичного ответа>

После тайм-аута сеанса, если я пытаюсь сделать Ajax вызов в браузере зарегистрированного FullAjaxExceptonHandler будет показан ответ XML, а не отображаемая страница ошибки.

Аналогичная ошибка возникает, если используется PrimeExceptionHandler. Если оба обработчика excepton удалены, аналогичный неправильный вывод в браузере и исключение приходит. См. EDIT выход для браузера.

EDIT 2 Если строки в web.xml изменены на "JSP" Вход

 <form-login-page>/login/login.jsp</form-login-page> 
     <form-error-page>/login/login.jsp</form-error-page> 

тогда AjaxExceptionHandler не называется.

login.xhtml очень похож на https://stackoverflow.com/a/2207147/2023524. Только с помощью RequestScope и просмотра без учета состояния.

выход в браузере:

<partial-response id="j_id1"><changes><update id="javax.faces.ViewRoot"><html xmlns="http://www.w3.org/1999/xhtml"> 
      text of ErrorHandlerViewExpired.xhtml ... 

</html></update><update id="j_id1:javax.faces.ViewState:0">stateless</update></changes></partial-response> 

web.xml:

<login-config> 
    <auth-method>FORM</auth-method> 
    <realm-name>app</realm-name> 
    <form-login-config> 
     <form-login-page>/login/login.xhtml</form-login-page> 
     <form-error-page>/login/login.xhtml</form-error-page> 
    </form-login-config> 
</login-config> 
<error-page> 
    <error-code>500</error-code> 
    <location>/errors/errorHandlerWeb.xhtml?faces-redirect=true</location> 
</error-page> 
<error-page> 
    <exception-type>javax.faces.application.ViewExpiredException</exception-type> 
    <location>/errors/errorHandlerViewExpired.xhtml?faces-redirect=true</location> 
</error-page> 
<error-page> 
    <exception-type>java.lang.Exception</exception-type> 
    <location>/errors/errorHandlerProg.xhtml</location> 
</error-page> 

лица-config.xml:

<factory> 
    <exception-handler-factory> 
     org.omnifaces.exceptionhandler.FullAjaxExceptionHandlerFactory 
    </exception-handler-factory> 
</factory> 

консоли:

FullAjaxExceptionHandler: An exception occurred during processing JSF ajax request. Error page '/errors/errorHandlerViewExpired.xhtml?faces-redirect=true' will be shown.: javax.faces.application.ViewExpiredException: viewId:/login/login.xhtml - Ansicht /login/login.xhtml konnte nicht wiederhergestellt werden. 
    at com.sun.faces.lifecycle.RestoreViewPhase.execute(RestoreViewPhase.java:212) [jsf-impl-2.2.11.jar:2.2.11] 
    at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101) [jsf-impl-2.2.11.jar:2.2.11] 

EDIT

Выход в браузере без некоторого ajaxExceptionHandler:

<partial-response id="j_id1"> 
    <redirect url="/app/pageWithAjax.jsf"/> 
    <error> 
    <error-name>class javax.faces.application.ViewExpiredException</error-name> 
    <error-message>viewId:/login/login.xhtml - Ansicht /login/login.xhtml konnte nicht wiederhergestellt werden. 
    </error-message></error></partial-response> 
+0

Это ограниченная страница с логином? Как вы аутентифицируете пользователей? Весенняя безопасность? Независимо от того, что это структура проверки подлинности, кто неправильно повторяет запрос ajax JSF вместо создания нового запроса GET. – BalusC

+0

Страница ограничена аутентификацией «FORM». Пользователи аутентифицируются через JSF Login backing bean. (Стандартный Java EE) Вход в систему - это «login/login.xhtml». Тогда это должно быть 'WildFly', что создает проблемы. Также см. Обновление – Tony

+0

. Я перечитал вопрос и немного запутался в точном прецеденте. Понимаю ли я это право: 1) У вас есть ограниченная страница JSF, открытая в браузере. 2) Сессия заканчивается в фоновом режиме. 3) Вы запускаете запрос ajax на этой ограниченной странице JSF. 4) Вы видите с содержимым 'errorHandlerViewExpired.xhtml' plain в браузере. Правильно ли эта последовательность? – BalusC

ответ

0

Правильное решение с Omnifaces описано здесь:

https://stackoverflow.com/a/35843836/2023524


Вот решение для конкретной конкретной ситуации, только если пользователь выполнил вход в систему с помощью Java EE loging и хочет перенаправить на страницу с ошибкой, а не на страницу входа.

import java.io.IOException; 

import javax.faces.FacesException; 
import javax.faces.application.ViewExpiredException; 
import javax.faces.context.ExceptionHandler; 
import javax.faces.context.FacesContext; 

import org.omnifaces.exceptionhandler.FullAjaxExceptionHandler; 
import org.omnifaces.util.Faces; 

public class CustomExceptionViewExpiredHandler extends FullAjaxExceptionHandler{ 

    public CustomExceptionViewExpiredHandler(ExceptionHandler wrapped) { 
     super(wrapped); 
    } 

    @Override 
    public void handle() throws FacesException { 
      boolean b = handleViewExpiredException(Faces.getContext()); 
      if (!b) 
       return; 
      super.handle(); 

    } 

    private boolean handleViewExpiredException (FacesContext context){ 
     if (context == null || !context.getPartialViewContext().isAjaxRequest()) { 
      return false; // Not an ajax request. 
     } 

     //Test user Principal, java authentication 
     if (Faces.getSession() == null || Faces.getRequest().getUserPrincipal() == null){ 
      try { 
       String errorPageLocation = findErrorPageLocation(context, new SomeSessionExpiredException()); 

       Faces.redirect(Faces.getRequestContextPath() + errorPageLocation); 
       Faces.responseComplete(); 
       return false; 
      } catch (IOException e) { 
       e.printStackTrace(); 
       return false; 
      } 
     } 
     return true; 
    } 
} 
Смежные вопросы