Частично десериализовать объект весеннего сеанса, хранящийся в hazelcast

Я использую hazelcast для репликации сеанса в весеннем приложении, которое является приложением mvc. У меня есть отдельное приложение, которое представляет собой шлюз api (весенний облачный шлюз), в котором есть клиент hazelcast, чтобы иметь возможность читать сведения о сеансе hazelcast из приложения mvc.

Сеанс Spring хранит сведения о сеансе в hazelcast в следующем формате:

session Id => MapSession
                          -> id = "xyz"
                          -> sessionAttrs 
                                          -> session attributes set if any
                                          -> SPRING_SECURITY_CONTEXT = SecurityContextImpl

Мой клиент hazelcast при попытке прочитать карту сеанса с использованием идентификатора сеанса

hazelcastInstance.getMap("spring:session:sessions").get(sessionId)

завершается с ошибкой HazelcastSerializationException, причина SecurityContextImpl.class не найдена. Этот класс не будет присутствовать в приложении весеннего облачного шлюза, поскольку он является реактивным. Меня не волнует атрибут SPRING_SECURITY_CONTEXT на стороне шлюза. Мне просто нужны другие атрибуты сеанса, которые я установил. Так можно ли игнорировать SecurityContextImpl и при этом десериализовать MapSession? пожалуйста помоги.


person Naresh    schedule 08.10.2018    source источник


Ответы (1)


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. больше информации.

person mdogan    schedule 09.10.2018