我正在使用hazelcast在Spring应用程序(这是一个mvc应用程序)中进行会话复制。我有一个单独的应用程序,即api网关(春季云网关),该应用程序具有hazelcast客户端,可以从mvc应用程序中读取hazelcast会话详细信息。
Spring会话将会话详细信息以以下格式存储在hazelcast中:
session Id => MapSession
-> id = "xyz"
-> sessionAttrs
-> session attributes set if any
-> SPRING_SECURITY_CONTEXT = SecurityContextImpl
我的hazelcast客户端尝试使用会话ID读取会话地图时
hazelcastInstance.getMap("spring:session:sessions").get(sessionId)
失败,错误为 HazelcastSerializationException ,导致未找到 SecurityContextImpl.class 。此类不会在Spring Cloud Gateway应用程序中出现,因为它是响应式的。我不在乎网关端的SPRING_SECURITY_CONTEXT属性。我只需要设置的其他会话属性。那么有可能忽略SecurityContextImpl并反序列化MapSession吗?请帮忙。
答案 0 :(得分:0)
Hazelcast支持为任何类(包括java.io.Serializable
类)定义自定义序列化程序。
您可以为MapSession
类注册自定义序列化程序,并跳过读取SPRING_SECURITY_CONTEXT
属性。
static class MapSessionSerializer implements StreamSerializer<MapSession> {
@Override
public void write(ObjectDataOutput out, MapSession object) throws IOException {
// write attributes
}
@Override
public MapSession read(ObjectDataInput in) throws IOException {
MapSession mapSession = new MapSession();
// read attributes
return mapSession;
}
@Override
public int getTypeId() {
return typeId;
}
@Override
public void destroy() {
}
}
[...]
SerializerConfig serializerConfig = new SerializerConfig()
.setTypeClass(MapSession.class)
.setImplementation(new MapSessionSerializer());
config.getSerializationConfig().addSerializerConfig(serializerConfig);
有关更多信息,请参见Hazelcast custom serialization部分。