2008-11-11 10 views
7

Tengo un cliente flexible que realiza llamadas de servicio a un servidor tomcat que ejecuta BlazeDS. Me gustaría manejar con gracia los tiempos de espera de la sesión del servidor en este entorno.Gestión elegante del tiempo de espera del servidor en BlazeDS

Tengo restricciones de seguridad en el servicio, por lo que el cliente se autentica frente a un objeto remoto al inicializar un ChannelSet basado en el destino y luego iniciar sesión usando ese ChannelSet.

Después de autenticar al usuario, si obtienen una taza (larga) de café, su sesión inevitablemente terminará.

Me gustaría que el cliente detecte el tiempo de espera y devuelva al usuario a la página de inicio de sesión con los mensajes informativos apropiados.

Pero estoy teniendo dificultades para encontrar la mejor manera de detectar este tiempo de espera del cliente. ¿Es posible, o debo hacer que el servidor arroje un error cuando ocurre el tiempo de espera?

Gracias!

Respuesta

0

Mire los documentos y vea si se desencadena un evento cuando se desconecta la conexión. Me imagino que existe. De lo contrario, use try/catch alrededor de sus conexiones y detecte cualquier problema relacionado con la conexión. Si lo haces, redirige tu aplicación y notifica al usuario. Probablemente necesites jugar con él para encontrar los códigos de error exactos que se lanzan para los problemas de conexión, pero debería ser bastante fácil en la depuración.

0

Encontré este problema en un proyecto, particularmente porque BlazeDS tenía un tiempo de espera de sesión diferente al de la aplicación real (usando una arquitectura de inicio de sesión único vía ClearTrust). Nota debida, esto fue en un entorno JBoss. Terminé tomando un enfoque bastante simple al buscar 2 códigos de falla específicos en los manejadores de fallas (tenía una clase base con un manejador de fallas común): DuplicateSessionDetected y DeliveryInDoubt. Vi que DuplicateSessionDetected cada vez que BlazeDS intentaba crear una nueva sesión para el mismo ID de sesión de JBoss. DeliveryInDoubt también apareció a veces, pero no estoy seguro de por qué. Cuando vi esos códigos de falla, tomé las medidas necesarias para actualizar la aplicación (dependiendo de sus necesidades, podría redireccionar a una página de inicio de sesión u otra cosa). Obviamente, dependiendo del entorno, es posible que tenga que escuchar un código de falla diferente, y este enfoque puede no funcionar en todas las situaciones dadas diferentes entornos/configuraciones/etc.

Otro enfoque que se discutió fue utilizar un temporizador en la aplicación Flex que representaría el temporizador de tiempo de espera de BlazeDS, pero no soy partidario de tener temporizadores sentados para ese fin. También he escuchado sobre enviar un poco de información al servidor para verificar el tiempo de espera, pero una vez más, eso parecía menos que ideal.

+0

¿Qué versión de BlazeDS estás usando? – Rydell

+0

estamos usando 3.2.0.3978 – pinkeerach

1

Escribimos un componente personalizado para que el cliente capture las pulsaciones de teclas y los eventos del mouse y luego manejamos los tiempos de espera en el cliente.

+0

No hay manera de detectar el tiempo de espera en el lado del cliente por lo que esta es la solución ideal. Si configura el tiempo de espera en el cliente para que sea un poco menor que el servidor, esto funciona muy bien. –

+1

El evento 'IDLE' resolvería esto para usted desde el primer momento: http://bit.ly/cQljgq –

0

He encontrado este problema en uno de mis proyectos. Lo que hice para superar eso es que cada vez que el cliente accede al servidor, ya sea a través de RemoteObject o HTTPService, primero verifica la autenticación del usuario, si ya ha agotado el tiempo de espera, devolverá algo y, si está bien, continuará su proceso. En el evento de resultado del manejador de respuesta del lado del cliente, el cliente verifica si la respuesta es de tiempo de espera y si lo está, se reenviará a la página de inicio de sesión nuevamente. Por lo que sé, no hay manera de que el servidor arroje un error al cliente cuando la sesión del usuario agotó el tiempo de espera. Simplemente sabrá que la sesión se agotó en su próximo acceso al servidor.

0

Implemente la interfaz FlexSessionListener en el lado del servidor. Proporciona una forma de manejar la creación/destrucción de sesiones Flex antes de que realmente se realicen.

En el controlador de sesión destruida, utilice un Productor de mensajería para enviar un mensaje del servidor al cliente informándole que la sesión está a punto de agotarse.

+0

El problema con esto es que las clases abstractas FlexSession y FlexClient solo exponen una forma estática para escuchar la sesión/cliente crea eventos. Al observar el código, el conjunto de destruir oyentes no se almacena de la misma manera estática, por lo que incluso anular las clases no proporcionará una manera fácil de hacerlo. Me parece que ingenuamente les dio a los usuarios finales de la API BlazeDS una manera fácil de hacerlo en el servidor – Alex

1

Implementamos un servicio de IU personalizado que hace ping al servidor constantemente (1 ping por 10 minutos) impidiendo así que AppServer cierre la conexión. También ejecutamos un temporizador de IU interno que se elimina cada vez que se realiza una solicitud (excepto el "ping") con una función completa que llama a la IU para volver a iniciar sesión y mostrar "La sesión expiró debido a la inactividad del cliente".

1

Esto no es específico de BlazeDS, pero a partir de Flex 4.5 (posiblemente anterior) hay un código específico de fallo en caso de fallo de los errores de tiempo de espera:

En el administrador de fallos:

if(faultEvent.fault.faultCode == "Client.Error.RequestTimeout"){ 
    trace("TIMEOUT ERROR"); 
} 
0

Extend CallResponder, y anula el método de falla.

Compruebe data.fault.faultCode para conocer los códigos de error conocidos, como ErrorMessage.MESSAGE_DELIVERY_IN_DOUBT.

Si recibe un golpe, use la función nativa navigateToURL para redirigir.

Cuestiones relacionadas