我正在尝试使用Spring SecurityContexTholder获取会话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();
这每次都正确返回会话ID。我想知道这两种访问会话ID的区别。
您将不是使用auth.getDetails().getSessionId()
获取当前会话。它不是为了使用该用法。WebAuthenticationDetail
的Java Doc说:
字符串getsessionId():指示从。 和创作者: 因此,您获得了收到凭据时存在的会话的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
SessionFixationProtectionStrategy
,那么您获得的ID应该是即将关闭的会话中的ID,以防止会话固定攻击。RequestContextHolder
:sessionId = RequestContextHolder.currentRequestAttributes().getSessionId();
请注意 requestContexTholder.currentRequestAttributes()。getSessionId() anforce session session创建,如果呼叫的时刻不存在会话。此外, requestContexTholder#CurrentRequestAttributes()可能会产生RuntimeException。
在我的角度来看,出于记录目的,使用以下代码获得SessionID是更好,更安全的:
ServletRequestAttributes ra = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
HttpSession session = ra != null ? ra.getRequest().getSession(false) : null;
String sessionId = session != null ? session.getId : null;