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
.