shiro登录
2023-12-11 10:51:01 1 举报
shiro登录获取redis的session集合
作者其他创作
大纲/内容
实现如下
登录校验接口login/check
2、身份验证定位在shiro获取session忙
1、api方法:/check:定位在身份验证忙
shiro-redis:2.4.2.1获取所有redis存的sessionsRedisSessionDAO#getActiveSessions
一、卡慢dump日志定位
private String keyPrefix = \"shiro_redis_session:\";@Override public Collection<Session> getActiveSessions() { Set<Session> sessions = new HashSet<Session>(); //获取redis所有shiro_redis_session开头的值 Set<byte[]> keys = redisManager.keys(this.keyPrefix + \"*\"); if(keys != null && keys.size()>0){ for(byte[] key:keys){ //循环获取所有shiro_redis_session并存于sessions集合中(此处一直忙) Session s = (Session)SerializeUtils.deserialize(redisManager.get(key)); sessions.add(s); } } return sessions; }
优化改造:旧(循环获取redis值) -> (批量获取reids值)
身份验证:CustomRealm#doGetAuthenticationInfo
//获取所有的session Collection<Session> sessions = sessionDAO.getActiveSessions();
自定义SectionManager,其他方法保持不变,下面方法修改为@Overridepublic Collection<Session> getActiveSessions() { Set<String> keys = redisTemplate.keys(SESSION_REDIS_KEY_PREFIX + \"*\"); if (keys != null && !keys.isEmpty()) { List<Object> sessions = redisTemplate.opsForValue().multiGet(keys); if (sessions != null) { return sessions.stream().map(o -> (Session) o).collect(Collectors.toList()); } } return Collections.emptySet();}
0 条评论
回复 删除
下一页