gpt4 book ai didi

java - 使用spring SecurityContextHolder在tomcat中 session ID为空

转载 作者:行者123 更新时间:2023-11-28 22:12:04 25 4
gpt4 key购买 nike

我正在尝试使用 spring SecurityContextHolder 获取 session ID。像下面一样

public static String getSessionId(){  
String id = null;
SecurityContext secContext = SecurityContextHolder.getContext();
Authentication auth = secContext.getAuthentication();
if(auth!=null){
WebAuthenticationDetails details = (WebAuthenticationDetails) auth.getDetails();
if(details!=null){
id = details.getSessionId();
}

}
return id;
}

大多数时候 details.getSessionId(); 都是 null。有时它会返回 sessionId。我想知道是什么原因造成的。这是访问sessionId的正确方式吗?
我尝试了 RequestContextHolder.currentRequestAttributes().getSessionId();
这每次都会正确返回 session ID。我想知道这两种访问 session ID 的方式之间的区别。

最佳答案

您不应使用auth.getDetails().getSessionId() 获取当前 session 。它不适用于该用途。 WebAuthenticationDetail 的 java 文档说:

String getSessionId() :指示身份验证请求是从接收的 HttpSession id。(强调我的)

对于创作者:

public WebAuthenticationDetails(javax.servlet.http.HttpServletRequest request)
Records the remote address and will also set the session Id if a session already exists
(it won't create one).
Parameters:
request - that the authentication request was received from

因此您可以获得收到凭据时存在的 session 的 ID

更糟糕的是,如果您使用的是 SessionFixationProtectionStrategy,您获得的 ID 应该是来自现在已关闭以防止 session 固定攻击的无效 session 的 ID。

所以正确的方法是使用RequestContextHolder:

sessionId = RequestContextHolder.currentRequestAttributes().getSessionId();

关于java - 使用spring SecurityContextHolder在tomcat中 session ID为空,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30213475/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com