В двух словах, для Весенний сеанс и, в частности, Весенний сеанс для Pivotal GemFire (SSDG), дочтобы выполнить свою работу, SessionRepositoryFilter
( Javadoc , Source ) должен быть первым фильтром сервлетов в цепочке фильтров при регистрации в вашем (Web) контейнере приложений(например, Apache Tomcat, Eclipse Jetty и т. д.).
В противном случае, если Spring Session's SessionRepositoryFilter
не является первым фильтром сервлетов в цепочке фильтров, тогда Spring Session не будет перехватывать HTTP-запрос (пока) и не сможет воспользоваться возможностью заменить сеанс контейнера (обернув HttpServletRequest
на SessionRepositoryFilter.SessionRepositoryRequestWrapper
, см. здесь ) на Session
предоставляется Spring Session с использованием соответствующего провайдера (например, как GemFire с SSDG), как определено реализацией SessionRepository
, которая установлена на SessionRepositoryFilter
( здесь ).
Причиной работы вашего приложения Spring Web MVC Controller
являетсяспецификация / контейнер сервлета Java EE гарантирует, что все фильтры сервлетов будут вызваны до вызова любых сервлетов с помощью HTTP-запроса (т. е. HttpServletRequest
).И, поскольку Spring Web MVC DispatcherServlet
является правильным HttpServlet
и отвечает за вызов вашего Spring-MVC Controllers
, определенного приложением, то приложение Controllers
гарантированно увидит «замененный» HTTP-запрос (ипо сути, объект сеанса HTTP).
Итак, несколько вспомогательных элементов ... Я (точно) не уверен, что вы подразумеваете под:
2.0.5
версия GemFire.2.0.5
относится к последней / текущей версии Весенний сеанс для Pivotal GemFire .
И webappinitializer
?
Для # 2, вы имели в виду, что специально создали Spring WebApplicationInitializer
для явной регистрации SessionRepositoryFilter
вручную (как показано выше в вашем фрагменте кода)?
Знаете ли вы, что Spring Session уже предоставляет такой класс ... o.s.session.web.context.AbstractHttpServletApplicationInitializer
.
Этот класс отвечает за регистрацию SessionRepositoryFilter
используя класс Spring DelegatingFilterProxy
( здесь , затем здесь и здесь (обратите внимание на переменную экземпляра insertBeforeOtherFilters
, которая по умолчанию true
),и в правильном порядке, здесь , в частности, здесь ).
Интересно, что кажется, что вы делаете то же самое или подобное вприведенный выше фрагмент кода фильтра.
ПРИМЕЧАНИЕ. Это (программная конфигурация контейнера Servlet) работает только в контейнерах Servlet 3.0.и позже.
Вы можете увидеть, как Spring Session's AbstractHttpServletApplicationInitializer
используется в samples , например, здесь .Более подробную информацию о Initializer
можно найти в соответствующих справочных документах для образца.
В регистрации класса Spring DelegatingFilterProxy
(названной в честь компонента SessionRepositoryFilter
, названного по-разному)Я заметил, что "springSessionRepositoryFilter") вы передаете DelegatingFilterProxy.class
в качестве второго аргумента servletContext.addFilter("filterName", <FilterType>);
, как показано здесь ...
FilterRegistration.Dynamic springSessionRepositoryFilter =
container.addFilter("springSessionRepositoryFilter", DelegatingFilterProxy.class);
Однако Spring Session (ядро) на самом деле создает и инициализирует (с именем бина "springSessionRepositoryFilter") экземпляр класса Spring DelegatingFilterProxy
, а передает этот "экземпляр" в ServletContext.addFilter(..)
метод (2-й аргумент) при регистрации.
Я подозреваю, что сам API ServletContext.addFilter(..)
просто использует конструктор по умолчанию класса Spring DelegatingProxyFilter
при создании / инициализации экземпляра, который, вероятно, является причиной вашей проблемы,особенно при программной регистрации фильтра сервлетов.
Пища для размышлений.
Надеюсь, это поможет!