Pregunta

Ok pregunta simple. Tengo una aplicación JSF que contiene una página de inicio de sesión. El problema es que si el usuario carga la página de inicio de sesión, la deja por un tiempo, luego intenta iniciar sesión, la sesión caduca y se genera una ViewExpiredException. Podría redirigir nuevamente al inicio de sesión cuando esto ocurra, pero eso no es muy sencillo. ¿Cómo puedo permitir que este flujo inicie sesión correctamente sin un intento adicional?

¿Fue útil?

Solución

Update

A partir de Mojarra 2.1.19 / 2.2.0 ahora puede establecer el atributo transitorio de <f:view> en verdadero:

<f:view transient="true">
     Your regular content
</f:view>

Puede leer más en blog de Balusc aquí:

http://balusc.blogspot.com.br/2013 /02/stateless-jsf.html

Original

Si está utilizando Facelets, puede crear su propio ViewHandler para manejar esto:

public class LoginViewHandler extends FaceletViewHandler
{
    public LoginViewHandler( ViewHandler viewHandler )
    {
        super( viewHandler );
    }

    @Override
    public UIViewRoot restoreView( FacesContext ctx, String viewId )
    {
        UIViewRoot viewRoot = super.restoreView( ctx, viewId );

        if ( viewRoot == null && viewId.equals( "/login.xhtml" ) )
        {
            // Work around Facelet issue
            initialize( ctx );

            viewRoot = super.createView( ctx, viewId );
            ctx.setViewRoot( viewRoot );

            try
            {
                buildView( ctx, viewRoot );
            }
            catch ( IOException e )
            {
                log.log( Level.SEVERE, "Error building view", e ); 
            }
        }

        return viewRoot;
    }
}

Cambiar " /login.xhtml " a su página de inicio de sesión. Esto verifica si puede restaurar su vista, y si no puede y la vista actual es su página de inicio de sesión, creará y construirá la vista por usted.

Establezca esto en su face-config.xml de la siguiente manera:

<application>
    <!-- snip -->
    <view-handler>my.package.LoginViewHandler</view-handler>
</application>

Si está utilizando JSF sin Facelets (es decir, JSP), puede intentar que la clase extienda ViewHandlerWrapper; tenga en cuenta que buildView () no estará disponible. Con suerte, createView () por sí solo configurará la vista correctamente, pero no estoy 100% seguro con JSF / JSP.

Otros consejos

Parece que su página de inicio de sesión está en el alcance de la sesión, cuando realmente no es necesario. El alcance de la solicitud debería estar bien para una página de inicio de sesión (ya que, de manera realista, no debería haber nada en la sesión antes de que el usuario inicie sesión). Una vez que el usuario inicia sesión, es posible que este problema vuelva a aparecer, pero las ideas de Phill son muy buenas a partir de ahí.

Con jsp puede deshabilitar la sesión para una página que incluye esta directiva <%@ page session="false" %>. Debe haber algo similar para jsf.

Un par de soluciones ligeramente hacky:

  • (Muy hacky) usa una etiqueta <meta http-equiv="refresh" content="5"/> para recargar automáticamente la página cada cierto tiempo.
  • Use una función de JavaScript para enviar periódicamente una solicitud de 'ping' al servidor para mantener viva la sesión.

Usamos IceFaces en el trabajo que detecta automáticamente cuándo ha expirado su sesión y muestra una ventana emergente que le alerta al hecho. Pero a veces todavía tenemos problemas en la página de inicio de sesión por alguna razón.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top