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方法。

 

修改后测试,发现果然有用,原来真的是这个地方的原因。

 

版权声明:本文为wsg888原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/wsg888/p/9294193.html