Spring Sessions HttpSession 无法完全替换 JSESSIONID

Dav*_*988 5 spring redis spring-session

我正在考虑将用户会话从应用程序级别移动到 Redis 实例。我相信我已经根据文档(http://docs.spring.io/spring-session/docs/current/reference/html5/#httpsession)正确设置了所有内容,但我没有看到我的行为期待并认为我在某处错过了一步。

该应用程序当前使用 HttpSession,因此我只是将以下内容添加到上下文中:

<context:annotation-config/>
<util:constant static-field="org.springframework.session.data.redis.config.ConfigureRedisAction.NO_OP"/>
<beans:bean class="org.springframework.session.data.redis.config.annotation.web.http.RedisHttpSessionConfiguration"/>
<beans:bean id="jedisConnectionFactory" class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory" p:host-name="HOSTNAME" p:port="6379" />
Run Code Online (Sandbox Code Playgroud)

在 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>
</filter-mapping>
Run Code Online (Sandbox Code Playgroud)

应用程序构建、部署和加载页面很好,但是当我查看页面上的 cookie 时,我同时拥有 JSESSIONID 和 SESSION。我知道 JSESSIONID 是 Spring Security 使用的,看起来 SESSION 是 Spring Session 使用的。当我查看 redis 时,看起来 SESSION 是存储的那个。

另一个问题是自定义会话对象(使用 session.setAttribute 添加)没有显示在会话中。会话中唯一显示的是登录后,并且是 SPRING_SECURITY_CONTEXT 对象。当我删除 Spring Session 过滤器时,这些对象被添加到会话中就好了。

这是正常行为,还是我的设置有一些奇怪的冲突?

小智 4

我遇到了同样的问题,最后发现这是由于我的 web.xml 中声明的过滤器顺序错误造成的。请求经过的第一个过滤器是 spring security 过滤器,它在响应中设置 JSESSIONID cookie,然后 spring 会话存储库过滤器开始发挥作用,设置自己的 SESSION cookie。更改顺序以使 Spring 会话存储库过滤器首先执行其操作后,一切正常。