首页 > 解决方案 > 重定向后(Java/Kotlin Spring Web 应用程序)有时会导致会话 ID 发生变化的原因是什么?

问题描述

我有一个使用 Kotlin+Spring 构建的 Web 应用程序,它通过会话 ID 识别用户。在静态首页上,我有一个表单,在提交时,它会向“/start”发送一个 POST 请求。这是由 Spring 通过执行一些代码并将用户重定向到另一个页面“/page”来处理的——这是最少的代码:

@Controller
class SomeController() {
    // No GetMapping("/"), because '/' is 100% static

    @PostMapping("/start")
    fun start(@ModelAttribute someModelAttr: SomeModelAttr, model: Model,
              response: HttpServletResponse,
              session: HttpSession) {
        log.info { "POST /start visited by ${session.id}" }
        val id = getSomeStuffSynchronously(someModelAttr, session.id);
        response.sendRedirect("page/${id}")
    }

    @GetMapping("/page/{id}")
    fun page(@PathVariable id: String,
             model: Model,
             session: HttpSession) {
        log.info { "GET /page/${id} visited by ${session.id}" }
        doOtherStuff(id, session.id);
        return "page" // i.e. render a Thymeleaf template
    }

上面的代码假定start和中的会话 IDpage是相同的。但是,有时(但并非总是)这是错误的,这会破坏用户的内容。在这种情况下,日志行基本上是:

POST /start visited by abcd
Log from getSomeStuffSynchronously(someModelAttr, "abcd")
GET /page/123 visited by vxyz

不幸的是,发生这种情况时,我无法捕获浏览器发送和接收的标头,因为当我尝试时,我无法重现此问题。我检查过:

会话是 Cookie 会话,由 spring-session-redis 管理,Redis 中的超时设置为 15 分钟。但是,我没有看到访问该站点之间的时间与此问题发生之间的任何明显相关性。

我的问题是:什么可能导致会话 ID在重定向期间发生变化?

标签: springkotlinsessionwebcookies

解决方案


获得不同会话的原因可能是因为包含对会话的引用的 cookie/url 参数可能尚未设置/使用(因此每次都会生成一个新会话)。

这可能是一个显而易见的问题,但您确定负责处理会话的过滤器已注册吗?例如,您是否将@EnableRedisHttpSession注释添加到配置类(请参阅redig http session 文档)?


推荐阅读