如果我知道 Apache Shiro 中的会话 ID 而不使用任何哈希映射,如何验证会话 ID?

Posted

技术标签:

【中文标题】如果我知道 Apache Shiro 中的会话 ID 而不使用任何哈希映射,如何验证会话 ID?【英文标题】:How to validate session ID if I know the session ID in Apache Shiro without the use of any hash maps? 【发布时间】:2016-05-13 20:39:29 【问题描述】:

我知道可以使用 hashmap 验证会话 ID 并将其附加到侦听器。还有一个不推荐使用的方法来仅使用会话 ID 字符串进行验证。

我想知道是否有另一种方法可以在不使用任何哈希图的情况下验证 Apache Shiro 中的已知会话 ID?

【问题讨论】:

【参考方案1】:

另一种解决方案是使用传递的会话 ID 创建主题,然后尝试获取该主题的会话。如果会话存在,那么它将返回其session,否则返回null。例如,以下方法可用于使用传递的会话 ID 验证 Apache Shiro 的会话。

 public static boolean isSessionValid(String sessionId)  
      Subject requestedSubject = new Subject.Builder().sessionId(sessionId).buildSubject();
      return !(requestedSubject.getSession(false) == null);
  

【讨论】:

为什么我总是得到异常:SessionKey must be an HTTP compatible implementation。根据debug,我发现如果我们只把sessionId放到builder里面,会创建DefaultSessionKey,不兼容HTTP,所以WebUtils.isHttp(key) 会返回false,会抛出异常。 @Utkal Sinha 我也在尝试相同的方法。我的 cookie 中有会话 ID。我正在传递会话 ID 以进行验证。我遇到错误 "URL": "http://gui_backend/edennet/commanding/session/F996B1458D66427FC36877BB2FEC87C9", "exceptionClass": "class java.lang.IllegalArgumentException", "RESTMethod": "GET", "message": "SessionKey must be an HTTP compatible implementation.", "rootCausePointClass": "org.apache.shiro.web.session.mgt.ServletContainerSessionManager", "rootCausePointMethod": "getSession"

以上是关于如果我知道 Apache Shiro 中的会话 ID 而不使用任何哈希映射,如何验证会话 ID?的主要内容,如果未能解决你的问题,请参考以下文章

shiro 中的 JSF 更改会话超时

Spring 上的 Apache Shiro 会话管理

Shiro 过期会话处理

Apache Shiro Stateless - 无会话 JWT 令牌认证问题

Apache Shiro 认证授权加密和会话管理

Shiro 中的并发会话控制