在集群环境中使用 Flash 时发生 JSF1094 错误
JSF1094 error happened when use Flash in cluster env
我在集群环境中使用 primefaces 11(alb + 两个 wildfly 17 + 可分发设置)。
我用Flash从page1传参数到page2时出现如下错误,参数传不上去
[javax.enterprise.resource.webcontainer.jsf.flash] (default task-29) JSF1094: Could not decode flash data from incoming cookie value Invalid characters in decrypted value. Processing will continue, but the flash is unavailable for this request.
如果我运行只在一台服务器上,参数可以正常传递。
- 设置数据
Flash flash = FacesContext.getCurrentInstance().getExternalContext().getFlash();
flash.put(REDIRECT_DATA_KEY, rData);
- 获取数据
Flash flash = FacesContext.getCurrentInstance().getExternalContext().getFlash();
return (RedirectData) flash.get(REDIRECT_DATA_KEY);
我该如何解决?
来自 Red Hat 官方支持:
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0">
...
<env-entry>
<env-entry-name>jsf/FlashSecretKey</env-entry-name>
<env-entry-type>java.lang.String</env-entry-type>
<!-- http://www.digitalsanctuary.com/aes-key-generator.php -->
<env-entry-value>Ya+MAlSDzgC3LAXgfEoPA/J6saEp7MtjjF0P6LP69nGk=</env-entry-value>
</env-entry>
<distributable/>
</web-app>
jsf/FlashSecretKey 是 base64 编码的 AES 256 位密钥,用于加密 flash 范围 cookie,如 csfcfc=K8auYBA%3D;。
密钥可以通过以下代码生成:
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import java.security.NoSuchAlgorithmException;
import java.util.Base64;
public class Main {
public static void main(String ... args) throws NoSuchAlgorithmException {
KeyGenerator keyGen = KeyGenerator.getInstance("AES");
keyGen.init(256); // key length is 256 byte
SecretKey secretKey = keyGen.generateKey();
System.out.println("key: " + Base64.getEncoder().encodeToString(secretKey.getEncoded()));
}
}
Flash cookie 值Set-Cookie:csfcfc=K8auYBA%3D;默认情况下是 AES 加密的。如果未设置 JNDI 密钥 java:comp/env/jsf/FlashSecretKey,Mojarra 将尝试为 flash cookie 值创建一个用于 AES 加密的随机密钥。
在集群环境的情况下,该行为将导致每个集群 EAP 实例具有不同的密钥。因此,Mojarra 无法恢复集群 flash cookie 值,并显示以下错误消息:
20:09:40,317 SEVERE [javax.enterprise.resource.webcontainer.jsf.flash] (default task-1)
JSF1094: Could not decode flash data from incoming cookie value Invalid characters in decrypted value. Processing will continue, but the flash is unavailable for this request.
我在集群环境中使用 primefaces 11(alb + 两个 wildfly 17 + 可分发设置)。 我用Flash从page1传参数到page2时出现如下错误,参数传不上去
[javax.enterprise.resource.webcontainer.jsf.flash] (default task-29) JSF1094: Could not decode flash data from incoming cookie value Invalid characters in decrypted value. Processing will continue, but the flash is unavailable for this request.
如果我运行只在一台服务器上,参数可以正常传递。
- 设置数据
Flash flash = FacesContext.getCurrentInstance().getExternalContext().getFlash(); flash.put(REDIRECT_DATA_KEY, rData);
- 获取数据
Flash flash = FacesContext.getCurrentInstance().getExternalContext().getFlash(); return (RedirectData) flash.get(REDIRECT_DATA_KEY);
我该如何解决?
来自 Red Hat 官方支持:
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0">
...
<env-entry>
<env-entry-name>jsf/FlashSecretKey</env-entry-name>
<env-entry-type>java.lang.String</env-entry-type>
<!-- http://www.digitalsanctuary.com/aes-key-generator.php -->
<env-entry-value>Ya+MAlSDzgC3LAXgfEoPA/J6saEp7MtjjF0P6LP69nGk=</env-entry-value>
</env-entry>
<distributable/>
</web-app>
jsf/FlashSecretKey 是 base64 编码的 AES 256 位密钥,用于加密 flash 范围 cookie,如 csfcfc=K8auYBA%3D;。 密钥可以通过以下代码生成:
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import java.security.NoSuchAlgorithmException;
import java.util.Base64;
public class Main {
public static void main(String ... args) throws NoSuchAlgorithmException {
KeyGenerator keyGen = KeyGenerator.getInstance("AES");
keyGen.init(256); // key length is 256 byte
SecretKey secretKey = keyGen.generateKey();
System.out.println("key: " + Base64.getEncoder().encodeToString(secretKey.getEncoded()));
}
}
Flash cookie 值Set-Cookie:csfcfc=K8auYBA%3D;默认情况下是 AES 加密的。如果未设置 JNDI 密钥 java:comp/env/jsf/FlashSecretKey,Mojarra 将尝试为 flash cookie 值创建一个用于 AES 加密的随机密钥。
在集群环境的情况下,该行为将导致每个集群 EAP 实例具有不同的密钥。因此,Mojarra 无法恢复集群 flash cookie 值,并显示以下错误消息:
20:09:40,317 SEVERE [javax.enterprise.resource.webcontainer.jsf.flash] (default task-1)
JSF1094: Could not decode flash data from incoming cookie value Invalid characters in decrypted value. Processing will continue, but the flash is unavailable for this request.