Перенаправление на время ожидания сеанса в JSF-Richfaces-facelet - PullRequest
6 голосов
/ 17 сентября 2009

Я использую JSF с RichFacecs для создания веб-портала. Я хочу перенаправить пользователя на страницу входа по истечении времени сеанса. Я пытался выдать исключение SecurityException на этапе истечения / выхода из сеанса следующим образом

<error-page>
    <exception-type>java.lang.SecurityException</exception-type>
    <location>/Login.jsf</location>
</error-page>

Но это не работает для меня. Какой правильный способ справиться с этим?

Ответы [ 5 ]

7 голосов
/ 18 сентября 2009

Это должно сделать это:

<error-page>
    <exception-type>javax.faces.application.ViewExpiredException</exception-type>
    <location>/sessionExpired.jsf</location>
</error-page>
4 голосов
/ 03 мая 2012

Вы должны поместить тайм-аут в ваш web.xml и зарегистрировать фильтр тайм-аута, как показано в этой теме: Автоматический выход из системы в приложении JSF в случае ajax ваше перенаправление должно быть сделано так:

    String facesRequestHeader = httpServletRequest
            .getHeader( "Faces-Request" );

    boolean isAjaxRequest = facesRequestHeader != null
            && facesRequestHeader.equals( "partial/ajax" );

    if( isAjaxRequest )
    {
            String url = MessageFormat.format( "{0}://{1}:{2,number,####0}{3}",
            request.getScheme(), request.getServerName(),
            request.getServerPort(), timeoutPath );

            PrintWriter pw = response.getWriter();
                pw.println( "<?xml version=\"1.0\" encoding=\"UTF-8\"?>" );
            pw.println( "<partial-response><redirect url=\"" + url
            + "\"></redirect></partial-response>" );
            pw.flush(););
    }
    else
    {
        httpServletResponse.sendRedirect( timeoutPath );
    }
1 голос
/ 02 мая 2011

У меня были некоторые проблемы при отправке запросов A4J после истечения сеанса. Я положил это

<context-param>
    <param-name>com.sun.faces.enableRestoreView11Compatibility</param-name>
    <param-value>true</param-value>
</context-param>

в моем web.xml, для меня это решает проблему.

1 голос
/ 05 марта 2010

Решение состоит в том, чтобы использовать Richfaces session expired event.

Добавьте это на страницу, склонную к истечению срока действия:

<a4j:region>
 <script language="javascript">
 A4J.AJAX.onExpired = function(loc, expiredMsg){
 alert('expired!');
 window.location = "/login.jsf";
 }
 </script>
</a4j:region>

Дополнительную информацию можно найти в документации RichFaces: http://docs.jboss.org/richfaces/latest_3_3_X/en/devguide/html/ArchitectureOverview.html#SessionExpiredHandling

0 голосов
/ 19 октября 2009

Другим решением является создание CustomViewHandler, расширяющего ViewHandler. и переопределить метод restoreView

@Override
public UIViewRoot restoreView(FacesContext facesContext, String viewId) {
/**
 * {@link javax.faces.application.ViewExpiredException}. This happens only  when we try to logout from timed out pages.
 */
    UIViewRoot root = null; 
    root = parent.restoreView(facesContext, viewId);
    if(root == null) {          
        root = createView(facesContext, viewId);
    }
    return root;
}

Затем вам нужно добавить его в файл face-config.xml

<view-handler>com.demo.CustomViewHandler</view-handler>

Это помешает вам получить ViewExpiredException

...