当用户登录服务器之后服务器会给用户分配一个session,假如用户用同一个session访问服务器,服务器应该可以把用户识别出来,不应该切换网页之后,服务器就“不认识”用户了。要做到这一点后台需要建立一个map,将一个session和一个用户绑定起来,通过维护map可以实现对在线用户的管理。具体实现看代码:
public class ClientManager {
private static ClientManager instance = new ClientManager();
private ClientManager(){
}
public static ClientManager getInstance(){
return instance;
}
private Map<String,Client> map = new HashMap<String, Client>();
/**
*
* @param sessionId
* @param client
*/
public void addClinet(String sessionId,Client client){
map.put(sessionId, client);
}
/**
* sessionId
*/
public void removeClinet(String sessionId){
map.remove(sessionId);
}
/**
*
* @param sessionId
* @return
*/
public Client getClient(String sessionId){
return map.get(sessionId);
}
/**
*
* @return
*/
public Collection<Client> getAllClient(){
return map.values();
}
}
用户登录之后,将map中添加sessionId和user的对应关系,但是当用户长期没操作的时候,应该将分配给用户的session注销掉,并将map中对应记录移除,相当于给用户下线。
<session-config>
<session-timeout>30</session-timeout>
</session-config>
以上是设置session的过期时间为30分钟。还需要在session销毁的时候将用户登录状态remove掉,于是需要注册sessionListener:
<listener>
<listener-class>org.jeecgframework.web.system.listener.SessionListener</listener-class>
</listener>
监听器应该这样写:
public class SessionListener implements HttpSessionListener {
private Map<Integer, List<TSFunction>> shortcutFunctionMap = null;
private SystemService systemService;
public SystemService getSystemService() {
return systemService;
}
@Autowired
public void setSystemService(SystemService systemService) {
this.systemService = systemService;
}
@Override
public void sessionCreated(HttpSessionEvent event) {
}
@Override
public void sessionDestroyed(HttpSessionEvent event) {
//在session销毁的时候
HttpSession session = event.getSession();
// TSUser user = ClientManager.getInstance().getClient(session.getId()).getUser();
shortcutFunctionMap = null;
// systemService.addLog("用户" + user.getUserName() + "已退出",
// Globals.Log_Type_EXIT, Globals.Log_Leavel_INFO);
ClientManager.getInstance().removeClinet(session.getId());
}
}