viewid - el tiempo de espera de jsf se agota
view expired primefaces (4)
Ok pregunta simple. Tengo una aplicación JSF, que contiene una página de inicio de sesión. El problema es si el usuario carga la página de inicio de sesión, la deja por un momento y luego intenta iniciar sesión. La sesión expira y se lanza una ViewExpiredException. Podría redireccionar 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?
Un par de soluciones ligeramente hacky:
- (Muy raro) use 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 ''ping'' al servidor para mantener la sesión activa.
Usamos IceFaces en el trabajo, que detecta automáticamente cuándo ha expirado su sesión y muestra una ventana emergente que le alerta sobre el hecho. Pero aún tenemos problemas en la página de inicio de sesión por algún motivo.
Parece que su página de inicio de sesión está en el alcance de la sesión, cuando realmente no tiene que ser así. El alcance de la solicitud debería estar bien para una página de inicio de sesión (ya que, realísticamente, no debería haber nada en 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 incluya esta directiva <%@ page session="false" %>
. Debe haber algo similar para jsf.
Actualizar
A partir de Mojarra 2.1.19 / 2.2.0, ahora puede establecer el atributo transitorio de <f:view>
en true:
<f:view transient="true">
Your regular content
</f:view>
Puedes leer sobre en el 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;
}
}
Cambie "/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 para 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.