2009-06-23 27 views
18

Esta pregunta está relacionada con mi otra pregunta "How to redirect to Login page when Session is expired in Java web application?". A continuación se muestra lo que estoy tratando de hacer:Manejo de 'sesión expiró' en la aplicación web JSF, ejecutándose en JBoss AS 5

  1. Tengo una aplicación JSF web que se ejecuta en JBoss AS 5
  2. Cuando el usuario está inactivo durante, digamos 15 minutos, necesito la sesión del usuario y redirigirlo a la página de inicio de sesión, si está tratando de usar la aplicación una vez que la sesión ha expirado.
  3. Por lo tanto, como se sugiere en 'JSF Logout and Redirect', he implementado un filtro que comprueba la condición expirada de la sesión y redirige al usuario a una página session-timed-out.jsp, si la sesión ha expirado.
  4. He agregado SessionExpiryCheckFilter encima de todas las demás definiciones de filtro en web.xml, de modo que la comprobación de caducidad de mi sesión siempre recibirá el primer acierto.

Ahora viene el desafío Estoy frente a. Dado que estoy usando JBoss AS, cuando la sesión expiró, JBoss automáticamente me redirige a la página de inicio de sesión (tenga en cuenta que el filtro de verificación de caducidad de la sesión no se invoca). Entonces, después de iniciar sesión, mi SessionExpiryCheckFilter intercepta la solicitud y ve que hay una sesión disponible. Pero, arroja la excepción javax.faces.application.ViewExpiredException: viewId:/mypage.faces - View /mypage.faces could not be restored.

¿Alguien ha enfrentado este problema antes? Alguna idea para resolver este problema?

+0

¿Estás usando Seam? –

+0

No. No estoy usando Seam. – Veera

+0

¿Está utilizando Facelets o JSPs? – mtpettyp

Respuesta

15

El siguiente enfoque funciona para mí. Tenga en cuenta que debe usar el redireccionamiento de taglib central JSTL y no el redireccionamiento de jsp para que esto funcione (ya que el jsp también caduca).

En su FacesConfig.xml se pone el siguiente:

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

sessionExpired.jsp:

<%@page contentType="text/html" pageEncoding="UTF-8"%> 

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" 
"http://www.w3.org/TR/html4/loose.dtd"> 
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> 

<c:redirect url="/login.jsf" /> 

También puede utilizar este enfoque para otros tipos de error o excepciones Por ejemplo, el elemento contiene un mapeo entre un código de error o el tipo de excepción y el camino de un recurso en la aplicación web .:

<error-page> 
    <error-code>400</error-code> 
    <location>/400.html</location> 
</error-page> 

o elemento contiene un nombre de clase completo de un tipo de excepción de Java.

<error-page> 
    <exception-type>javax.servlet.ServletException</exception-type> 
    <location>/servlet/ErrorDisplay</location> 
</error-page> 
3

Si está utilizando Mojarra/Sun RI, puede intentar agregar esto a su sitio web.xml:

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

Sin embargo, tenga en cuenta que esta no siempre es la solución perfecta. Oculta el hecho de que el usuario ha perdido su sesión.

+0

Esta no es la mejor solución. – Makky

1

Implementar javax.faces.event.PhaseListener para Restaurar vista

@Override 
public void afterPhase(PhaseEvent event) { 
    FacesContext facesContext = event.getFacesContext(); 
    if(facesContext.getViewRoot()==null){ 
     try{ 
      facesContext.getExternalContext().redirect(HOME_PAGE); 
      facesContext.responseComplete(); 
     } catch (IOException e){ 
      e.printStackTrace(); 
     } 
    } 
} 

@Override 
public void beforePhase(PhaseEvent event) {} 

@Override 
public PhaseId getPhaseId() { 
    return PhaseId.RESTORE_VIEW; 
} 

registro en el faces-config.xml

0

intenté escribir un filtro para ella, pero de alguna forma que no funcionaba para mí , así que hice una alternativa para ello.

lo hice así en todas las páginas que yo no quiero que el usuario tenga acceso sin ingreso:

<f:view> 
    <h:dataTable value="#{userHome.validuser()}"/> 
    // my code 
<f:view/> 

Esto llamará a la función validuser() que está en mi sesión de bean gestionado.

Ahora esta es mi función. Durante el inicio de sesión, ya inserté el objeto de usuario en la sesión.

public void validuser() 
{ 
    FacesContext context = FacesContext.getCurrentInstance(); 
    UserLogin ul = (UserLogin) context.getExternalContext().getSessionMap().get("userbean"); 

    if (ul == null) 
     try{ 
       context.getExternalContext().redirect("/HIBJSF/faces/LoginPage.xhtml"); 
       context.responseComplete(); 
     } 
     catch (IOException e) 
     { 
     e.printStackTrace(); 
     } 
} 

Si hay una sesión, pero nadie se había iniciado la sesión, a continuación, que le llevará a una página de redirección.

Cuestiones relacionadas