alexxiyang/shiro-redis

通过RedisSessionDAO的getActiveSessions获取在线用户数据功能存在BUG

lotilaly opened this issue · 10 comments

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,望作者考虑修复。
本人才疏学浅,说的不对的地方望指正!

+1 遇到这个问题了

我们可自己fork一份,给他提pr 如果作者不合并 我们就自己发release

这个问题我已经修复并向作者发起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修复这个问题 谢谢

遇到同样的问题了...

dngzs commented

#120 @manondidi 是我描述的这个bug吧?
jedis版本 2.9.2

是啊, 我已经提交pullrequest了 作者不维护了,建议走jwt 去做token
如果用jwt 就用我修复的这个版本

com.github.manondidi shiro-redis 3.2.10

多谢, PR已经合并

作者你好,get active sessions error. 遇到这个问题

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;
}