Миграция ServletRequestListener после принятия весенних сессий

Недавно мы начали интегрировать весеннюю сессию в наш проект. Это приложение на основе SOA и имеет некоторые логические реализации для управления сеансами.

  1. HttpSessionListener, который мы используем для выхода из сеансов в случае тайм-аута и отслеживаем через sessionDestroyed(HttpSessionEvent httpSessionEvent).
  2. ServletRequestListener, который мы используем для управления инвалидацией сеанса HTTP. Это реализовано в методе requestDestroyed(ServletRequestEvent servletRequestEvent).

По пункту №1 я нашел статью здесь, в котором описывается использование SessionEventHttpSessionListenerAdapter, поддерживаемое Spring Session. И добавьте эту конфигурацию в мой session.xml.

<context:annotation-config/>
<bean class="org.springframework.session.hazelcast.config.annotation.web.http.HazelcastHttpSessionConfiguration"/>

<bean class="org.springframework.session.web.http.SessionEventHttpSessionListenerAdapter">
    <constructor-arg>
        <list>
            <bean class="xxx.xxx.xxx.xxx.xxx.xxx.MyHttpSessionListener"/>
        </list>
    </constructor-arg>
</bean>

Также добавлена ​​​​ниже конфигурация в моем дескрипторе развертывания (например, web.xml)

<filter>
    <filter-name>springSessionRepositoryFilter</filter-name>
    <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
</filter>
<filter-mapping>
    <filter-name>springSessionRepositoryFilter</filter-name>
    <url-pattern>/*</url-pattern>
    <dispatcher>REQUEST</dispatcher>
    <dispatcher>ERROR</dispatcher>
</filter-mapping>

После некоторой отладки я заметил, что мой HttpSessionListener использует сеанс, предоставленный весенним сеансом.

Однако для элемента № 2, используя реализацию ServletRequestListener, я не смог найти способ перенести его на весенний сеанс. Он все еще использует сеанс, предоставленный контейнером.

Есть ли соответствующий адаптер, например SessionEventHttpSessionListenerAdapter, предназначенный для ServletRequestListener? Поддерживается ли это Spring Session? Какие еще варианты у меня есть, чтобы наша функциональность работала с весенней сессией?


person nbats    schedule 10.02.2021    source источник


Ответы (1)


В итоге я использовал настраиваемый фильтр для управления аннулированием сеанса HTTP. Изменил web.xml, добавив последовательно следующие записи:

(a) Зарегистрируйте springSessionRepositoryFilter

<filter>
    <filter-name>springSessionRepositoryFilter</filter-name>
    <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
</filter>
<filter-mapping>
    <filter-name>springSessionRepositoryFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

(b) Добавить фильтр запросаContext

<filter>
    <filter-name>requestContextFilter</filter-name>
    <filter-class>org.springframework.web.filter.RequestContextFilter</filter-class>
</filter>
<filter-mapping>
    <filter-name>requestContextFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

(c) Добавить пользовательский фильтр

<filter>
    <filter-name>myCustomServletRequestFilter</filter-name>
    <filter-class>com.xxx.xxx.xxx.servlet.filter.MyCustomServletRequestFilter</filter-class>
</filter>
<filter-mapping>
    <filter-name>myCustomServletRequestFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

(d) Загрузить контекст весенней сессии

<listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>

<context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>classpath*:application-context.xml</param-value>
</context-param>

Все HTTP-запросы теперь используют весенний сеанс.

person nbats    schedule 22.02.2021
comment
Обнаружена другая проблема при последующих запросах. Он перенаправляется на страницу входа. Проверяя некоторые ресурсы, это может быть связано с настройкой CORS, поскольку я вижу эти новые значения заголовка запроса: Sec-Fetch-Site, Sec-Fetch-Mode, Sec-Fetch-Dest, sec-ch-ua, sec-ch-ua-mobile. Эти заголовки не возвращались/не включались до интеграции весеннего сеанса. Если кто-то сталкивался с такой же проблемой, подскажите, как вы ее решили. - person nbats; 24.02.2021