2011-11-15 29 views
6

Tengo una página de inicio de sesión donde tengo un bean User para autenticar el nombre de usuario y la contraseña de una persona. Este frijol tiene alcance de sesión. Si alguien escribe una URL e intenta saltar la página de inicio de sesión, ¿cómo puedo verificarlo y redirigirlo a la página de inicio de sesión?Comprobar si existe sesión JSF

Por otro lado. Supongamos que he iniciado sesión y que estaba trabajando y de repente salgo por un tiempo y mi sesión expira. Cuando regreso e intento interactuar con el formulario, envía un mensaje que me avisa de la caducidad de la sesión. ¿Cómo puedo redireccionar de nuevo al formulario de inicio de sesión cuando esto ocurre?

Gracias de antemano. Espero que me explique.

Mojarra 2.1.4, Tomcat 7, Tomahawk 1.1.11

Respuesta

14

Si alguien escribe un URL y trata de saltar la página de inicio de sesión, ¿cómo puedo comprobar que y le redirigirá a la página de inicio de sesión?

Parece que usa la autenticación interna. En ese caso, debe implementar un servlet filter. JSF sesión de tiendas de ámbito de granos gestiona como atributos de HttpSession, por lo que sólo pudo comprobar que, en doFilter() método:

HttpServletRequest req = (HttpServletRequest) request; 
UserManager userManager = (UserManager) req.getSession().getAttribute("userManager"); 

if (userManager != null && userManager.isLoggedIn()) { 
    chain.doFilter(request, response); 
} else { 
    HttpServletResponse res = (HttpServletResponse) response; 
    res.sendRedirect(req.getContextPath() + "/login.xhtml"); 
} 

Ubicación filtro en un patrón de URL que cubre las páginas seguras, por ejemplo, /app/*.


Cuando regrese y tratar de interactuar con el formulario se envía un mensaje de alertándome la expiración de sesión. ¿Cómo puedo redirigir de nuevo al formulario de inicio de sesión cuando esto ocurre?

Entiendo que esto se refiere a las solicitudes de Ajax? Para solicitudes normales, podría haber usado un <error-page> en web.xml. Si la configuración del estado método para el cliente ahorrar en web.xml de la siguiente manera

<context-param> 
    <param-name>javax.faces.STATE_SAVING_METHOD</param-name> 
    <param-value>client</param-value> 
</context-param> 

no es una opción, entonces usted necesita para poner en práctica una costumbre ExceptionHandler:

public class ViewExpiredExceptionHandler extends ExceptionHandlerWrapper { 

    private ExceptionHandler wrapped; 

    public ViewExpiredExceptionHandler(ExceptionHandler wrapped) { 
     this.wrapped = wrapped; 
    } 

    @Override 
    public void handle() throws FacesException { 
     FacesContext facesContext = FacesContext.getCurrentInstance(); 

     for (Iterator<ExceptionQueuedEvent> iter = getUnhandledExceptionQueuedEvents().iterator(); iter.hasNext();) { 
      Throwable exception = iter.next().getContext().getException(); 

      if (exception instanceof ViewExpiredException) { 
       facesContext.getApplication().getNavigationHandler().handleNavigation(facesContext, null, "viewexpired"); 
       facesContext.renderResponse(); 
       iter.remove(); 
      } 
     } 

     getWrapped().handle(); 
    } 

    @Override 
    public ExceptionHandler getWrapped() { 
     return wrapped; 
    } 

} 

(tenga en cuenta que este ejemplo en particular se desplaza a viewexpired , por lo que espera un /viewexpired.xhtml como página de error)

Lo anterior debe ser horneado por la siguiente implementación ExceptionHandlerFactory ión:

public class ViewExpiredExceptionHandlerFactory extends ExceptionHandlerFactory { 

    private ExceptionHandlerFactory parent; 

    public ViewExpiredExceptionHandlerFactory(ExceptionHandlerFactory parent) { 
     this.parent = parent; 
    } 

    @Override 
    public ExceptionHandler getExceptionHandler() { 
     return new ViewExpiredExceptionHandler(parent.getExceptionHandler()); 
    } 

} 

que a su vez tiene que ser registrada en faces-config.xml de la siguiente manera:

<factory> 
    <exception-handler-factory>com.example.ViewExpiredExceptionHandlerFactory</exception-handler-factory> 
</factory> 
+0

Tenía algunas dudas sobre esto. Me pidieron que agregue un commandLink que dice "Ir a la página principal", pero cuando hago clic en él, va primero a la página ViewExpired y luego tengo que hacer clic de nuevo para ir a la página principal. ¿Cómo puedo ir directamente a la página principal sin hacer doble clic en el comando Enlace? – BRabbit27

+1

En su lugar, conviértalo en '' que envía una nueva solicitud GET sin necesidad de visualizar el estado. No es necesario que envíe ningún dato junto con POST, ¿verdad? – BalusC

+0

Eso resolvió el problema, pero apareció otro. Si permanezco en la página de inicio de sesión, también está ocurriendo ViewExpiredException. ¿Cómo evitar eso? – BRabbit27

1

Si va a implementar su propio sistema puede agregar un atributo al usuario llamado sesión o lo que sea. Este atributo puede ser boolean así que cada vez que inicie la sesión puede establecer este atributo en verdadero.Escribir un método llamado permiso por ejemplo:

public void permission() throws IOException { 

     if(userStatelessBean.getSession() == false) { 
      System.out.println("*** The user has no permission to visit this page. *** "); 
      ExternalContext context = FacesContext.getCurrentInstance().getExternalContext(); 
      context.redirect("login.xhtml"); 
     } else { 
      System.out.println("*** The session is still active. User is logged in. *** "); 
     } 
    } 

En cada uno de su página JSF (para este ejemplo) que desea tener restricciones sobre, se puede añadir el siguiente código al principio de su página:

<f:metadata> 
    <f:event type="preRenderView" listener="#{sesija.permission()}"/> 
</f:metadata> 

lo que esto va a hacer es llamar a la JSF ManagedBean con el nombre del objeto sesija antes de renderizar la página y comprobar si los rulles que ha creado en el método que se satisfagan determinadas o no.

espero que encuentre útil,

Gracias.

+0

U.V. ya que esto me ayudó a administrar los permisos, pero esto no responde a la pregunta real (administración de vistas caducadas) –