会话ID使用Spring SecurityContexTholder在Tomcat中以null为单位



我正在尝试使用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():指示从。

和创作者:

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

因此,您获得了收到凭据时存在的会话的ID

更糟糕的是,如果您使用的是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;

最新更新