Mejorando la experiencia de usuario: Como implementar un control del error de sesión expirada en JSF

27-01-2017
 
JSF

JSF

Para mejorar la experiencia del usuario cuando le caduquen las sesiones de JSF(JavaServer Faces) por inactividad, por actualización de la aplicación o por otras circunstancias lo haremos de la siguiente manera:

Configuramos en el fichero ‘faces-config.xml’ el ‘Exception Handler Factory’:

    <factory> 
      <exception-handler-factory> 
   com.lostsys.xxx.exception.CustomExceptionHandlerFactory 
      </exception-handler-factory> 
    </factory> 

Implementamos la classe configurada en el ‘Exception Handler Factory’:

public class CustomExceptionHandlerFactory extends ExceptionHandlerFactory { 
	 private ExceptionHandlerFactory parent; 
	 
	  public CustomExceptionHandlerFactory(ExceptionHandlerFactory parent) { 
	    this.parent = parent; 
	  	} 
	 
	  @Override 
	  public ExceptionHandler getExceptionHandler() { 
	    return new CustomExceptionHandler(parent.getExceptionHandler());
	  }	 
}

Finalmente ya solo nos queda implementar la classe con la lógica de negocio que estamos usando ‘CustomExceptionHandler’, en este caso, si la excepción es del tipo ‘ViewExpiredException’ muestra el mensaje “Your session have been expired. Please, reload and keep working. Thanks.”:

public class CustomExceptionHandler extends ExceptionHandlerWrapper { 
	 private ExceptionHandler wrapped; 
	  
	  public CustomExceptionHandler(ExceptionHandler wrapped) { this.wrapped = wrapped; } 
	 
	  @Override 
	  public ExceptionHandler getWrapped() { return wrapped; } 

	  @Override 
	  public void handle() throws FacesException { 
	    Iterator<ExceptionQueuedEvent> iterator = getUnhandledExceptionQueuedEvents().iterator(); 
	    
	    while (iterator.hasNext()) { 
	      ExceptionQueuedEvent event = iterator.next(); 
	      ExceptionQueuedEventContext context = (ExceptionQueuedEventContext)event.getSource(); 
	      Throwable throwable = context.getException(); 
	      
	      try { 
	    	  throwable.printStackTrace(); 
	    	  String error=throwable.getMessage()+"("+throwable.getClass().getName()+")"; 
	    	  
	    	  if ( throwable.getClass()==javax.faces.application.ViewExpiredException.class ) 
	    		  error="Your session have been expired. Please, reload and keep working. Thanks."; 
	          
	          FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_FATAL, "We are sorry :(", error );  	          
	          RequestContext.getCurrentInstance().showMessageInDialog(message);  	          
	          
	      } finally { 
	          iterator.remove(); 
	      } 
	    } 
	    
	    getWrapped().handle(); 
	  } 
}

Por último, para que el mensaje aparezca, el fichero de la vista ‘xhtml’ debe contener la etiqueta: ‘<p:messages id=”messagesEdit” showDetail=”true” autoUpdate=”true” closable=”true” />’.

Implementar un control de excepciones mejora mucho la experiencia del usuario con la aplicación ya que le aporta un feedback de que algo esta saliendo mal y le ayuda a entenderlo.

Leave a Reply

© Albert Coronado Calzada