首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在分布式内存缓存中存储AuthenticatedWebSession

如何在分布式内存缓存中存储AuthenticatedWebSession
EN

Stack Overflow用户
提问于 2019-05-06 08:34:36
回答 1查看 124关注 0票数 0

我正在尝试将wicket-6应用程序部署到kubernetes集群中,以提高可用性并更好地分配web应用程序的负载。

从我扩展AuthenticatedWebSession的意义上来说,这是一个有状态的web应用程序。我希望将这个会话对象存储在像Apache Ignite这样的分布式缓存中,这样我就不需要在负载均衡器上使用粘滞的会话。

问题是我的实现将AuthenticationManager注入到AuthenticatedWebSession中,因此authManager可以在身份验证(用户名、密码)方法中使用。

代码语言:javascript
复制
@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字段时,问题就出现了。实际上,我不需要将管理器本身存储在缓存中。

有没有办法在会话从缓存中恢复时重新注入该对象?

也许我的处理方式完全错了。感觉像是掉进了一个兔子洞:)

EN

回答 1

Stack Overflow用户

发布于 2019-05-06 13:32:09

因为它是一个@SpringBean,所以该实例是一个java.lang.reflect.Proxy或CGLIB代理。代理很容易(反)序列化,因为它们不会将实际实例保留为硬引用。它们通过Spring的应用程序上下文动态地查找Spring bean。查看wicket-spring模块中的类的源代码。它们只是其中的一小部分。如果Ignite使用普通的Java序列化,那么它应该可以正常工作,但可能有一些自定义的东西。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55997555

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档