我想获得在线用户列表
这是我的代码
的web.xml
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
弹簧security.xml文件
<security:http auto-config="true">
<security:session-management>
<security:concurrency-control max-sessions="1" expired-url="/login?expire" />
</security:session-management>
</security:http>
和服务
@Service
public class UserSessionRegistry {
@Autowired
private SessionRegistry sessionRegistry;
public List<User> getOnlineUsers() {
List<User> retValue = new ArrayList<User>();
List<Object> onlineUsers = sessionRegistry.getAllPrincipals();
for (Object usr : onlineUsers) {
retValue.add((User) usr);
}
return retValue;
}
}
但始终返回null作为结果
答案 0 :(得分:1)
通过使用此代码,您可以获得除尝试获取的用户之外的所有在线用户。
首先将SessionRegistry bean实现到spring-security配置中。
Authentication auth = SecurityContextHolder.getContext().getAuthentication();
String userName = auth.getName();
List<Object> principals = sessionRegistry.getAllPrincipals();
List<UserInfo> usersInfoList = new ArrayList<UserInfo>();
for (Object principal: principals) {
if (principal instanceof UserInfo) {
if(!((UserInfo) principal).getUsername().equals(userName)){
for(SessionInformation sess :sessionRegistry.getAllSessions(principal, false)){
if(!sess.isExpired()){
usersInfoList.add((UserInfo) sess.getPrincipal());
}
}
}
}
&#13;
答案 1 :(得分:0)
根据春季docs,您需要设置concurrency-control并将maximumSession
设置为-1
(如果您不需要控制并发数量)会话)。这样您就可以注册SessionRegistry
并可以访问主要信息。
答案 2 :(得分:0)
spring-security已更改如下,结果正确
<bean id="sessionRegistry"
class="org.springframework.security.core.session.SessionRegistryImpl" />
<security:http auto-config="true">
<security:session-management>
<security:concurrency-control
session-registry-ref="sessionRegistry" max-sessions="1" expired-url="/login?expire" />
</security:session-management>
</security:http>