当前位置: 首页 > 知识库问答 >
问题:

Websession无效不能从Spring Boot 2.0.2运行

黄扬
2023-03-14

我想将我的Spring Webflux项目从Spring Boot2.0.1升级到Spring Boot2.0.3。在我的项目中,我的会话是由Spring会话数据Redis支持的。在升级Spring Boot版本时,我注意到Spring Boot 2.0.2+中的websession无效问题。

在Spring Boot 2.0.1中,我通过以下方式使会话无效:

webSession.invalidate().subscribe();

这导致我的当前会话被破坏,生成了一个新的会话ID、创建时间等。

private static final class SessionMapper implements Function<Map<String, Object>, MapSession> {
        private final String id;

        private SessionMapper(String id) {
            this.id = id;
        }

        public MapSession apply(Map<String, Object> map) {
            MapSession session = new MapSession(this.id);
            session.setCreationTime(Instant.ofEpochMilli((Long)map.get("creationTime")));
            session.setLastAccessedTime(Instant.ofEpochMilli((Long)map.get("lastAccessedTime")));
            session.setMaxInactiveInterval(Duration.ofSeconds((long)(Integer)map.get("maxInactiveInterval")));
            map.forEach((name, value) -> {
                if (name.startsWith("sessionAttr:")) {
                    session.setAttribute(name.substring("sessionAttr:".length()), value);
                }

            });
            return session;
        }
    }
session.setCreationTime(Instant.ofEpochMilli((Long)map.get("creationTime")));

这是一个bug还是我错过了Spring Boot2.0.2+中关于Spring会话的一些新内容?

更新

为了提供更多信息,我创建了一个再现问题的示例项目:https://github.com/adsanche/test-redis-session

@Controller
public class HelloController {

    @GetMapping(value = "/hello")
    public String hello(final WebSession webSession) {

        webSession.getAttributes().put("test", "TEST");

        return "index";
    }

    @GetMapping(value = "/invalidate")
    public String invalidate(final WebSession webSession) {

        webSession.invalidate().subscribe();

        return UrlBasedViewResolver.REDIRECT_URL_PREFIX + "/hello";
    }
}

>

  • 转到第一个endpoint:http://localhost:8080/hello

    Redis中的会话状态:

    我们注意到以7546FF开头的会话ID,以及包含“test”属性加上默认会话信息(创建/上次访问时间等)的会话数据。

      null

    当前会话无效,并对“/hello”执行重定向,其中在新的web会话中添加了test属性。

    • 新会话在Redis中的状态:

    我们注意到新的会话ID以ba7de开头,新的会话数据仍然包含测试属性和默认会话信息。

    >

  • 转到第一个endpoint:http://localhost:8080/hello

    Redis中的会话状态:

    我们注意到以12D61开头的会话ID,以及包含“test”属性加上默认会话信息(创建/上次访问时间等)的会话数据。

  • 共有1个答案

    仲柏
    2023-03-14

    这是Spring Session的SpringSessionWebSessionStore中的一个bug,更具体地说,是其内部的WebSession实现中的一个bug。问题是,在websession#invalidate上,会话仅从基础会话存储中清除,但未标记为无效,因此后续的请求处理最终仍使用相同的会话ID。

    我已经在Spring会议上开放了gh-1114来解决这个问题。

    我相信您以前没有经历过这种情况,例如在Spring Session2.0.2.release及其以下版本中,这是由于SpringSessionWebSessionStore中的另一个bug在2.0.3.release中解决了-请参阅GH-1039。此问题是关于无法更新LastAccessedTime的,一旦我们修复了您描述的方案,您就开始失败了,原因是无效(和已删除)会话id的会话仅使用LastAccessedTime属性再次保存。

     类似资料:
    • 我在jupyter中,选择kernel scala 2.11,当我放置返回数据时运行平稳: 然后,当我执行时,它返回

    • 我正在使用NetBeans IDE 8.2和Maven 3.5.0。当NetBeans的一个操作试图下载插件时,它会失败: 下载:https://repo.maven.apache.org/maven2/org/codehaus/mojo/xml-maven-plugin/1.0/xml-maven-plugin-1.0.pom 我在以下位置定义了代理: NetBeans:工具->选项->常规 C

    • 问题内容: 我刚刚使用jdk7创建了一个jar文件。我尝试运行它,但一直出现错误。原来,它指向的是jre6,而不是jdk7中的jre。因此,我使用以下命令对其进行了更改 ftype jarfile =“ C:\ jre \ bin \ javaw.exe的路径” -jar“%1”%* 之后,我试图再次双击我的jar文件,但是它弹出了一个窗口,要求我选择一个打开它的程序。当我选择与上述相同的java

    • 1.我从“git克隆https://github.com/corda/samples"”下载的 2.我从Intellij As页面打开项目(https://docs.corda.net/tutorial-cordapp.html#downloading-示例cordapp)显示 3.我选择了“运行示例CordApp-静态编程语言”,并开始调试 4.我从智能控制台得到一些例外 我访问“网址”,但它不

    • 问题内容: 我正在使用以下查询,以尝试从每个项目中检索最大数量的幻灯片的总数(总和),但是我收到以下错误(#1111-组功能的无效使用)。这是查询: 如果删除SUM(),则它可以工作,但是,对于所有项目/幻灯片,我都无法获得准确的总数。 预先感谢您的所有答复。 问题答案: