通过RedisSessionDAO的getActiveSessions获取在线用户数据功能存在BUG
lotilaly opened this issue · 10 comments
lotilaly commented
shiro-redis版本:3.2.3
在2.1版本的spring boot中同时引入data-redis可以正常使用,将spring boot升级到2.2版本后出现java.lang.NoSuchMethodError: redis.clients.jedis.ScanResult.getStringCursor()的错误。
调试后发现2.2版本的data-redis使用的是3.1.0的jedis,而shiro-redis使用的是2.9.0的jedis,shiro-redis下WorkAloneRedisManager的keys方法中,在循环从scanResult中获取keys时使用了scanResult.getStringCursor().compareTo(ScanParams.SCAN_POINTER_START) > 0的条件,而jedis在3.0之后将getStringCursor方法改为getCursor,所以才出现了错误。
本以为应该是通过版本升级进行修复,后来查看ScanResult.java源码发现,本身提供用于判断遍历是否结束的方法isCompleteIteration,而这个方法在2.9.0和3.*版本的jedis都存在,作用也都一样,所以认为出现上述错误,应该属于BUG,望作者考虑修复。
本人才疏学浅,说的不对的地方望指正!
manondidi commented
+1 遇到这个问题了
manondidi commented
我们可自己fork一份,给他提pr 如果作者不合并 我们就自己发release
manondidi commented
这个问题我已经修复并向作者发起pulling request 等作者merge之后就可以修复了
#118
在此之前,我已经把这个bug修复后自己发布了一份
接入方法 在pom.xml的 project节点下加入
<repositories>
<repository>
<id>jitpack.io</id>
<url>https://jitpack.io</url>
</repository>
</repositories>
将作者的库注释掉
替换成我的
<dependency>
<groupId>com.github.manondidi</groupId>
<artifactId>shiro-redis</artifactId>
<version>3.2.10</version>
</dependency>
希望作者能早日合并我的pr修复这个问题 谢谢
manondidi commented
这是我fork修复后的 https://github.com/manondidi/shiro-redis
aeroyu commented
遇到同样的问题了...
dngzs commented
#120 @manondidi 是我描述的这个bug吧?
jedis版本 2.9.2
manondidi commented
是啊, 我已经提交pullrequest了 作者不维护了,建议走jwt 去做token
如果用jwt 就用我修复的这个版本
alexxiyang commented
多谢, PR已经合并
abduhelel commented
作者你好,get active sessions error. 遇到这个问题
abduhelel commented
Collection sessions = redisSessionDAO.getActiveSessions();
shiro-源码
public Collection getActiveSessions() {
HashSet sessions = new HashSet();
try {
Set<byte[]> keys = this.redisManager.keys(this.keySerializer.serialize(this.keyPrefix + "*"));
if (keys != null && keys.size() > 0) {
Iterator i$ = keys.iterator();
while(i$.hasNext()) {
byte[] key = (byte[])i$.next();
Session s = (Session)this.valueSerializer.deserialize(this.redisManager.get(key));
sessions.add(s);
}
}
} catch (SerializationException var6) {
logger.error("get active sessions error.");
}
return sessions;
}