使用 Spring Security 检索会话 ID

Posted

技术标签:

【中文标题】使用 Spring Security 检索会话 ID【英文标题】:Retrieving Session ID with Spring Security 【发布时间】:2011-04-02 07:19:00 【问题描述】:

出于记录目的,我想创建一个记录器,自动将当前会话的 ID 添加到记录的行中。 对于已登录的用户,这不是问题:

((WebAuthenticationDetails) SecurityContextHolder.getContext().getAuthentication().getDetails())
    .getSessionId()

问题是,在用户登录之前getAuthentication() 返回null。是否有另一种方法可以在不引用当前响应或任何类似内容的情况下获取会话 ID?

【问题讨论】:

【参考方案1】:

你可以使用

RequestContextHolder.currentRequestAttributes().getSessionId();

这依赖于 Spring 的 RequestContextHolder,因此它应该与 Spring MVC 的 DispatcherServlet 一起使用,或者你应该声明一个 RequestContextListener。如果不存在,也会创建会话。

【讨论】:

@axtavt 我有 angular appli 在 diffrnt 端口中运行,服务器代码在 diffrnt 端口中运行。在我的服务器代码中实现了 Spring Security,如果成功,它会重定向到另一个 Java 控制器,因为我包装了所有用户角色和其他信息。但我只得到一个anonymusUser,因为我的重定向网址中没有cookie。是不是克服了你的解决方案..【参考方案2】:

更简单的方法是:

@GetMapping(path = "/foo")  
public void foo(HttpSession session)   
    String sessionId = session.getId();  

【讨论】:

以上是关于使用 Spring Security 检索会话 ID的主要内容,如果未能解决你的问题,请参考以下文章

如何防止 Spring Security 在会话中存储我的自定义 UserDetails 对象

如何使用 Spring Security 管理 Spring Boot 中的会话?

Spring Security 会话管理会话固定保护不起作用

使用 Spring Security 进行会话管理

如何使用 spring-security 和 jQuery 处理过期会话?

Spring Boot,Spring Security,会话范围 Bean 的会话超时问题,@PreDestroy