我们正在尝试使用 JEE8 安全 API 创建一个野蝇 16 高可用集群。项目可以作为独立应用程序很好地工作,但不能作为集群!我们得到了一个 infispan NotSerializableException。
我们有一个带有jsf 2.3,CDI 2.0和Soteria的Wildfly 16独立应用程序。 这作为独立运行良好。 现在我们想将此配置作为独立的野蝇集群运行。 野蝇来了,它们彼此认识。
但是,当我们调用应用程序时,我们得到以下异常: java.lang.IllegalArgumentException: org.infinispan.commons.marshall.NotSerializableException: org.glassfish.soteria.servlet.RequestData
如果需要,我们可以发布整个堆栈跟踪。
如果我们从 web.xml 中删除"可分发",它将毫无例外地工作,但随后我们无法在实例之间共享会话。
我们是否缺少一些配置?还是我们又有误会了?
谢谢你的帮助
@AutoApplySession
@LoginToContinue(loginPage = "/login.xhtml", errorPage = "", useForwardToLogin = true)
@ApplicationScoped
public class CustomAuthenticationMechanism implements HttpAuthenticationMechanism {
@Inject
private CustomIdentityStore identityStore;
...
}
@Model
public class LoginBean implements Serializable {
public void login() {
FacesContext context = FacesContext.getCurrentInstance();
Credential credential = new CustomCredential(username, password);
AuthenticationStatus status = securityContext.authenticate(
(HttpServletRequest) externalContext.getRequest(),
(HttpServletResponse) externalContext.getResponse(),
withParams()
.credential(credential)
.newAuthentication(false)
.rememberMe(true)
);
...
}
}
web.xml:
...
distributable
...
2019年7月3日编辑:
正如我现在所看到的,问题出在Soteria Impementation上。 我在 github 上找到了以下提交:"https://github.com/eclipse-ee4j/soteria/commit/fd9a29c4452f99b426dabc296ec759d36766a56f"。 现在的问题是,这什么时候上线? 为了实现对资源的基于角色的访问并将未经身份验证的用户重定向到自定义登录页面,它有哪些替代方案?
似乎需要在群集的服务器实例之间复制类型org.glassfish.soteria.servlet.RequestData
的对象。复制的工作原理是在一端序列化对象,然后在另一端再次反序列化对象。这就解释了为什么代码在非群集环境中工作。
但是,此类似乎没有实现java.io.Serializable
。您是否在任何会话范围的对象中使用RequestData
?