如果我知道 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?的主要内容,如果未能解决你的问题,请参考以下文章