alexxiyang / shiro-redis

shiro only provide the support of ehcache and concurrentHashMap. Here is an implement of redis cache can be used by shiro. Hope it will help you!
MIT License
1.17k stars 446 forks source link

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

Closed lotilaly closed 4 years ago

lotilaly commented 4 years ago
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 4 years ago

+1 遇到这个问题了

manondidi commented 4 years ago

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

manondidi commented 4 years ago

这个问题我已经修复并向作者发起pulling request 等作者merge之后就可以修复了 https://github.com/alexxiyang/shiro-redis/pull/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 4 years ago

这是我fork修复后的 https://github.com/manondidi/shiro-redis

aeroyu commented 4 years ago

遇到同样的问题了...

dngzs commented 4 years ago

https://github.com/alexxiyang/shiro-redis/issues/120 @manondidi 是我描述的这个bug吧? jedis版本 2.9.2

manondidi commented 4 years ago

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

com.github.manondidi shiro-redis 3.2.10
alexxiyang commented 4 years ago

多谢, PR已经合并

abduhelel commented 3 years ago

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

abduhelel commented 3 years ago

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