jsf websphere jsf-2.2 websphere-8 viewexpiredexception

jsf - Obtener ViewExpiredException en un entorno en clúster mientras el método de ahorro de estado se establece en el cliente y la sesión del usuario es válida



websphere jsf-2.2 (2)

Tengo una aplicación JSF que utiliza Mojarra 2.2.9 y se implementa en WebSphere 8.5.5.4 en un entorno en clúster y javax.faces.STATE_SAVING_METHOD está configurado en el client .

Aunque todos mis beans de aplicación tienen un alcance de solicitud, a veces, cuando la sesión del usuario es válida y el usuario está haciendo una solicitud posterior en una página, obtiene ViewExpiredException . ¿Qué puede estar causando este problema y cómo puedo resolverlo? ¿ javax.faces.STATE_SAVING_METHOD solucionará el cambio de javax.faces.STATE_SAVING_METHOD al server ? Si es así, ¿cuál es el impacto de hacer esto en la memoria?

Además, ¿tiene esto algo que ver con el entorno del clúster y tal vez haya alguna configuración faltante en el Websphere que resuelva el problema?


Debe tener la etiqueta distribuible en su web.xml como lo menciona balusc


Esto sucederá si el estado del lado del cliente está encriptado por un servidor y desencriptado por otro servidor y los servidores no usan la misma clave AES para esto. Normalmente, también debería haber visto la advertencia a continuación en el registro del servidor:

ERROR: MAC no verificó

jsf/ClientSideStateKey asegurarse de haber establecido jsf/ClientSideStateKey en web.xml con una clave AES fija; de lo contrario, cada servidor (re) generará su propia clave AES durante el inicio / reinicio (que se utiliza durante el estado de vista de cifrado).

<env-entry> <env-entry-name>jsf/ClientSideSecretKey</env-entry-name> <env-entry-type>java.lang.String</env-entry-type> <env-entry-value>[AES key in Base64 format]</env-entry-value> </env-entry>

Puede usar este fragmento para generar una clave aleatoria AES256 (32 bits) en formato Base64.

KeyGenerator keyGen = KeyGenerator.getInstance("AES"); keyGen.init(256); // Use 128 for 16bit key. String key = Base64.getEncoder().encodeToString(keyGen.generateKey().getEncoded()); System.out.println(key); // Prints AES key in Base64 format.

En caso de que obtenga Java Security: ¿tamaño de clave ilegal o parámetros predeterminados? error, instale la extensión de criptografía como se indica en el enlace o, en su lugar, genere una clave aleatoria AES128 (16 bits).

Después de tener la clave, asegúrese absolutamente de no publicar / abrir su clave.

Además, también debe asegurarse de haber agregado la etiqueta <distributable /> a web.xml para que JSF realice un ensuciamiento de sesión más agresivo y las sesiones HTTP (¡incluida la visualización de beans en sí mismos!) Se sincronizan correctamente en todos los servidores.

Otra causa probable de ViewExpiredException con el ahorro del estado del lado del cliente es que ha configurado el parámetro de contexto específico de Mojarra com.sun.faces.clientStateTimeout en web.xml que representa el tiempo en segundos antes de que un estado del lado del cliente entrante se considere caducado. Sin embargo, este es un caso poco probable, ya que ese parámetro de contexto tiene un nombre bastante autoexplicativo que habría visto simplemente mirando web.xml .

Ver también: