2009-09-17 21 views
6

Estoy usando JSF con RichFacecs para crear un portal web. Deseo redirigir al usuario a la página de inicio de sesión en el tiempo de espera de la sesión. Yo estaba tratando de lanzar una SecurityException en sesión de caducidad/cerrado la sesión de la siguiente etapaRedireccionando el tiempo de espera de la sesión en JSF-Richfaces-facelet

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

Pero esto no está funcionando para mí. ¿Cuál es la forma correcta de manejar esto?

Respuesta

7

Esto debe hacerlo:

<error-page> 
    <exception-type>javax.faces.application.ViewExpiredException</exception-type> 
    <location>/sessionExpired.jsf</location> 
</error-page> 
+0

Gracias por la responder. Intenté esto y no funciona para la solicitud ajax – Jinesh

+0

¿Puedes mostrar cómo has implementado la página expirada de la sesión? Es importante que la función de redirección que usas tampoco esté agotada =) –

+0

Estoy redirigiendo la página de inicio de sesión en la sesión que caduca. Tengo otra solución de trabajo. Ahora estoy redireccionando en el bean de respaldo como este FacesContext.getCurrentInstance(). GetExternalContext(). Redirect ("login.jsf"). ¿Es esta una manera correcta? – Jinesh

0

Otra solución es crear CustomViewHandler que se extiende ViewHandler y reemplazar el método 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; 
} 

Luego hay que añadirlo a sus faces-config.xml

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

Esto le impedirá obtener ting ViewExpiredException

+0

Nota: Creo que "padre" debe ser "super" y se puede agregar a createView también. También sugiero que se extienda una implementación de ViewHandler como com.sun.faces.application.ViewHandlerImpl para que no tenga que volver a escribir todas las clases de ViewHandler. – Adam

1

he tenido algunos problemas cuando hacer peticiones a4j después de la expiración de sesión. pongo este

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

en mi web.xml, para mí que resuelve el problema.

4

se debería poner un tiempo de espera en su web.xml y registrar un tiempo de espera de filtro como se muestra en este tema: Auto-logout in JSF Application en caso de Ajax, el cambio de dirección se tiene que hacer así:

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); 
    } 
Cuestiones relacionadas