春天 - 获得在线用户

时间:2014-09-30 18:53:26

标签: spring spring-security

我想获得在线用户列表

这是我的代码

的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作为结果

3 个答案:

答案 0 :(得分:1)

通过使用此代码,您可以获得除尝试获取的用户之外的所有在线用户。

首先将SessionRegistry bean实现到spring-security配置中。

&#13;
&#13;
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;
&#13;
&#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>