SessionRegistry.getAllSessions返回为空导致无法监控用户登录信息
public abstract interface SessionRegistry { public abstract List<Object> getAllPrincipals(); public abstract List<SessionInformation> getAllSessions(Object paramObject, boolean paramBoolean); public abstract SessionInformation getSessionInformation(String paramString); public abstract void refreshLastRequest(String paramString); public abstract void registerNewSession(String paramString, Object paramObject); public abstract void removeSessionInformation(String paramString); }
List allPrincipals = this.sessionRegistry.getAllPrincipals(); List activeUsers = new ArrayList(allPrincipals.size()); List list = allPrincipals; for (UserInfo userInfo : list) { if ((StringUtils.isNotBlank(username)) && (!(userInfo.getUsername().equals(username)))) { continue; } List allSessions = this.sessionRegistry.getAllSessions(userInfo, false); for (SessionInformation sessionInformation : allSessions) { UserInfo info = (UserInfo) sessionInformation.getPrincipal(); ActiveUser user = new ActiveUser(); user.setSessionId(sessionInformation.getSessionId()); user.setExpired(sessionInformation.isExpired()); user.setLastRequest(sessionInformation.getLastRequest()); user.setLoginTime(info.getLoginTime()); user.setLoginIp(info.getLoginIp()); user.setUsername(info.getUsername()); user.setRealname(info.getUserRealName()); user.setOrgName(info.getOrg().getOrgName()); activeUsers.add(user); } } return activeUsers;
公司的系统中有一个在线用户监控的功能,但是最近测试中,无法查到任何已登录用户信息。后台没有报错信息。
跟代码到后台的处理逻辑中。
搜了很多类似功能的代码,类似的常规写法,先获取sessionRegistry中的key值getAllPrincipals();
然后循环key值,获取对应的value值,获取所有的sessionsessionRegistry.getAllSessions(userInfo,false);
但是就是这个获取session的返回值为null,导致没有数据。
调试查看sessionRegistry的属性,猜测可能有两种可能,
第一种是session中没有录入用户登录和操作信息的,因此获取不到监控数据。
第二种可能就是session中有登录和操作信息,只是没有取到。
第一种情况无疑是很头疼的一种情况,由于对着一块不太了解,猜测可能要追溯到监听,配置中去,查看了大量的资料和博客,
没有查到合适的解答,大部分都是说配置错误,但是我检查了配置发现并无错误。
产生第二种想法是由于偶然看到网上唯一一篇,说在getAllSessions实现方法中
由于该处通过key值比较Object无法拿到其中的value值
需要重写对应实体类中的erquals方法和hashCode方法。由于半信半疑的原因我就在实体类的equals方法中打了个断点,
但是get方法获取value值的时候并未进入实体类的equals的断点里。由于当时已经找了很多,看了很多,觉得这个解决办法
似乎并不靠谱。
后来找了一天,看了一天,还是没有找到其他好的方法,决定把之前能试的方法都试一遍,毕竟代码这种东西,很多时候只有
实际操作了才能看到里面的真实情况,就像开卷有益,百闻不如一见。
决定改写实体类中的equals方法和hashcode方法。
修改后测试,发现果然有用,原来真的是这个地方的原因。