部分反序列化存储在hazelcast中的spring session对象

时间:2018-10-08 18:07:18

标签: spring-mvc hazelcast spring-session spring-cloud-gateway

我正在使用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吗?请帮忙。

1 个答案:

答案 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部分。