Spring Sessions HttpSession无法完全替代JSESSIONID

Spring Sessions HttpSession unable to completely replace JSESSIONID

我正在考虑将用户会话从应用程序级别移动到 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" />

向 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>

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

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

这是正常现象,还是我的设置导致了一些奇怪的冲突?

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

有同样的问题。但是过滤器排序没有帮助。

请求中传入JSESSIONID时可以同时响应SESSION和JSESSIONID,然后springsession会在提供的cookie中添加SESSION cookie(您可以在请求中清除cookie,只接收SESSION) .

我遇到这种情况的原因是:

默认情况下,cookie 由应用程序服务器 (tomcat) 提供,当我添加 spring 会话时,cookie 将由 spring 提供。 tomcat 的默认值为 JSESSIONID,spring (DefaultCookieSerializer.class) 的默认值为 SESSION

为了解决这个问题,我只是在 WEB.xml:

中指定了 cookies 名称
<session-config>
    <cookie-config>
        <name>JSESSIONID</name>
    </cookie-config>
</session-config>

这将为 tomcat 和 spring 会话过滤器指定 cookie 名称

我遇到了同样的问题。问题是 tomcat 会添加 JSESSIONID cookie 作为响应。所以我添加了 CookieSerializer 并解决了问题。

@Bean
public CookieSerializer cookieSerializer() {
    DefaultCookieSerializer serializer = new DefaultCookieSerializer();
    serializer.setCookieName("JSESSIONID"); 
    serializer.setCookiePath("/"); 
    serializer.setDomainNamePattern("^.+?\.(\w+\.[a-z]+)$"); 
    return serializer;
}

另外不要忘记像这样更改 tomcat 中的 context.xml

<Context cookies="false">
    ....
</Context>