【问题标题】:session id coming as null in tomcat using spring SecurityContextHolder使用spring SecurityContextHolder在tomcat中的会话ID为null
【发布时间】:2020-09-28 21:41:50
【问题描述】:

我正在尝试使用 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(); 是空的。有时它会返回 sessionId。我想知道是什么原因造成的。这是访问 sessionId 的正确方法吗?
我试过RequestContextHolder.currentRequestAttributes().getSessionId();
这每次都会正确返回会话ID。我想知道这两种访问会话ID的方式之间的区别。

【问题讨论】:

  • 这是访问sessionId的正确方式吗?可能不是。你不需要spring security api,但是servlet api:request.getSession().getId()
  • RequestContextHolder.currentRequestAttributes().getSessionId() 怎么样?访问会话ID?由于我无法访问类中的请求对象,因此我正在尝试获取会话 ID。

标签: java spring session tomcat


【解决方案1】:

您应该使用auth.getDetails().getSessionId() 来获取当前会话。它不适用于该用途。 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

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

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

所以正确的方法是使用RequestContextHolder

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

【讨论】:

  • 我理解了这个问题,那么获取会话 ID 的最佳方法是什么?是 RequestContextHolder.currentRequestAttributes().getSessionId();
  • 请注意,如果在调用时不存在会话,则 RequestContextHolder.currentRequestAttributes().getSessionId() 会强制创建会话。 Mover overm currentRequestAttributes 可能会产生 RuntimeException。在我看来,最好使用以下代码来获取 sessionId: ServletRequestAttributes ra = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes(); HttpSession 会话 = ra != null ? ra.getRequest().getSession(false) : null;字符串 sessionId = session != null ? session.getId : null;
【解决方案2】:

注意 RequestContextHolder.currentRequestAttributes().getSessionId() 如果在调用时不存在会话,则会强制创建会话。此外,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;

【讨论】:

    猜你喜欢
    • 2011-09-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-02
    • 2016-11-05
    • 2014-01-28
    • 1970-01-01
    • 2019-02-20
    相关资源
    最近更新 更多