Частично десериализовать объект весеннего сеанса, сохраненный в Hazelcast - PullRequest
0 голосов
/ 08 октября 2018

Я использую Hazelcast для репликации сессии в приложении Spring, которое является приложением MVC.У меня есть отдельное приложение, которое представляет собой API-шлюз (Spring Cloud Gateway), в котором есть клиент Hazelcast, чтобы иметь возможность считывать подробности сеанса Hazelcast из приложения MVC.

Весенний сеанс хранит сведения о сеансе 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 Cloud Gateway, поскольку он является реактивным.Меня не волнует атрибут SPRING_SECURITY_CONTEXT на стороне шлюза.Мне просто нужны другие атрибуты сеанса, которые я установил.Так можно ли игнорировать SecurityContextImpl и все же десериализовать MapSession?пожалуйста, помогите.

1 Ответ

0 голосов
/ 09 октября 2018

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 .

...