【问题标题】:Enforce separate sessions for different tabs in spring security为 Spring Security 中的不同选项卡强制执行单独的会话
【发布时间】:2026-02-09 05:00:02
【问题描述】:
我在我的 Web 应用程序中使用 spring security v 3.1.3。该应用程序有一个使用 spring security 中的自定义过滤器自定义的单条目登录表单。目前,我的配置允许用户在同一浏览器中从不同选项卡打开 URL 时自动登录应用程序,这是 Spring 安全会话管理的默认行为。
我想确保每当用户登录应用程序时,会话不应在不同的选项卡之间共享。在打开一个新选项卡时,他应该获得登录页面,并且登录将在同一浏览器中创建一个新会话。现在我找不到任何方法来使用弹簧安全框架来做到这一点。我不介意在 URL 中集成 JsessionID,但如果有其他方法会更好。
【问题讨论】:
标签:
spring
session
spring-mvc
spring-security
【解决方案1】:
您可以使用 HeaderWebSessionIdResolver。
Spring 默认使用 CookieWebSessionIdResolver。
要使用它,请使用随机 sessionId 并将其保存在会话存储中,然后将其与您的标头一起发送。这会因选项卡而异,并且会为您提供不同的网络会话。
val headerName = "SomeHeaderName"
@Configuration
class SessionConfig {
@Bean
fun headerWebSessionIdResolver(): WebSessionIdResolver {
return HeaderWebSessionIdResolver().apply {
headerName = headerName
}
}
@Bean
fun webSessionManager(webSessionIdResolver: WebSessionIdResolver): DefaultWebSessionManager {
return DefaultWebSessionManager().apply {
sessionIdResolver = webSessionIdResolver
}
}
}
【解决方案2】:
这不是 Spring Security 的限制,这是浏览器如何使用 cookie 的一般限制;如果你设置了一个 cookie,它将被所有标签共享。
说我现在能想到的唯一合理的选择是按照你的建议在 URL 中包含会话 ID。