我正在尝试将wicket-6应用程序部署到kubernetes集群中,以提高可用性并更好地分配web应用程序的负载。
从我扩展AuthenticatedWebSession的意义上来说,这是一个有状态的web应用程序。我希望将这个会话对象存储在像Apache Ignite这样的分布式缓存中,这样我就不需要在负载均衡器上使用粘滞的会话。
问题是我的实现将AuthenticationManager注入到AuthenticatedWebSession中,因此authManager可以在身份验证(用户名、密码)方法中使用。
@SpringBean(name = "webAuthenticationManager")
private AuthenticationManager authManager;
@Override
public boolean authenticate(String username, String password) {
boolean authenticated = false;
try {
authentication = authManager.authenticate(new UsernamePasswordAuthenticationToken(username, password));
authenticated = true;
} catch (AuthenticationException e) {
authenticated = false;
}
return authenticated;
}
Caused by: org.apache.ignite.binary.BinaryObjectException: Failed to read field [name=authManager]
at org.apache.ignite.internal.binary.BinaryFieldAccessor.read(BinaryFieldAccessor.java:192)
at org.apache.ignite.internal.binary.BinaryClassDescriptor.read(BinaryClassDescriptor.java:875)当Ignite试图序列化/反序列化authManager字段时,问题就出现了。实际上,我不需要将管理器本身存储在缓存中。
有没有办法在会话从缓存中恢复时重新注入该对象?
也许我的处理方式完全错了。感觉像是掉进了一个兔子洞:)
发布于 2019-05-06 13:32:09
因为它是一个@SpringBean,所以该实例是一个java.lang.reflect.Proxy或CGLIB代理。代理很容易(反)序列化,因为它们不会将实际实例保留为硬引用。它们通过Spring的应用程序上下文动态地查找Spring bean。查看wicket-spring模块中的类的源代码。它们只是其中的一小部分。如果Ignite使用普通的Java序列化,那么它应该可以正常工作,但可能有一些自定义的东西。
https://stackoverflow.com/questions/55997555
复制相似问题