spring - 重定向后(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
不幸的是,发生这种情况时,我无法捕获浏览器发送和接收的标头,因为当我尝试时,我无法重现此问题。我检查过:
- 无论用户是否在浏览器中使用隐身模式,此问题都可能发生
- 除了 front-page->/start->/page/id 之外,我还没有观察到其他请求会发生这种情况
- 我的托管服务提供商和 Spring 都没有启用缓存
- 我的网站上没有很大的负载
- 我不使用弹簧安全
会话是 Cookie 会话,由 spring-session-redis 管理,Redis 中的超时设置为 15 分钟。但是,我没有看到访问该站点之间的时间与此问题发生之间的任何明显相关性。
我的问题是:什么可能导致会话 ID在重定向期间发生变化?
解决方案
获得不同会话的原因可能是因为包含对会话的引用的 cookie/url 参数可能尚未设置/使用(因此每次都会生成一个新会话)。
这可能是一个显而易见的问题,但您确定负责处理会话的过滤器已注册吗?例如,您是否将@EnableRedisHttpSession
注释添加到配置类(请参阅redig http session 文档)?
推荐阅读
- javascript -
如何通过硒从标签分隔的元素中提取部分文本? - python - 将字典中的字符与字符串进行比较,删除 dic 项并将修改后的 dic 作为字符串返回
- c# - 如何在每个元素之前添加 string.Join 分隔符
- r - r:根据每个月的最大值编码虚拟变量
- python - 在 Tkinter 帧上播放带音频的视频
- database - how to store large medical images in a database online?
- php - 替换数组/对象php中的值
- maven - 未能在詹金斯执行 Maven 测试
- django - django-storages 为 S3 中的资产生成不正确的 url
- android - 如何编辑清单回收器项目以及新选择的项目