gpt4 book ai didi

java - 如何将经过身份验证的 WebSession 存储在分布式内存缓存中

转载 作者:行者123 更新时间:2023-12-02 05:57:39 26 4
gpt4 key购买 nike

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

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

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

@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 字段时,会出现此问题。实际上我不需要将管理器本身存储在缓存中。

当 session 从缓存恢复时,有没有办法重新注入(inject)该对象?

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

最佳答案

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

关于java - 如何将经过身份验证的 WebSession 存储在分布式内存缓存中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55997555/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com