【问题标题】: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。

    【讨论】:

      最近更新 更多