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;
公司的系統中有一個在線用戶監控的功能,可是最近測試中,沒法查到任何已登陸用戶信息。後臺沒有報錯信息。session
跟代碼到後臺的處理邏輯中。測試
搜了不少相似功能的代碼,相似的常規寫法,先獲取sessionRegistry中的key值getAllPrincipals();this
而後循環key值,獲取對應的value值,獲取全部的sessionsessionRegistry.getAllSessions(userInfo,false);spa
可是就是這個獲取session的返回值爲null,致使沒有數據。調試
調試查看sessionRegistry的屬性,猜想可能有兩種可能,code
第一種是session中沒有錄入用戶登陸和操做信息的,所以獲取不到監控數據。orm
第二種可能就是session中有登陸和操做信息,只是沒有取到。blog
第一種狀況無疑是很頭疼的一種狀況,因爲對着一塊不太瞭解,猜想可能要追溯到監聽,配置中去,查看了大量的資料和博客,ip
沒有查到合適的解答,大部分都是說配置錯誤,可是我檢查了配置發現並沒有錯誤。ci
產生第二種想法是因爲偶然看到網上惟一一篇,說在getAllSessions實現方法中
因爲該處經過key值比較Object沒法拿到其中的value值
須要重寫對應實體類中的erquals方法和hashCode方法。因爲半信半疑的緣由我就在實體類的equals方法中打了個斷點,
可是get方法獲取value值的時候並未進入實體類的equals的斷點裏。因爲當時已經找了不少,看了不少,以爲這個解決辦法
彷佛並不靠譜。
後來找了一天,看了一天,仍是沒有找到其餘好的方法,決定把以前能試的方法都試一遍,畢竟代碼這種東西,不少時候只有
實際操做了才能看到裏面的真實狀況,就像開卷有益,百聞不如一見。
決定改寫實體類中的equals方法和hashcode方法。
修改後測試,發現果真有用,原來真的是這個地方的緣由。