SpringBoot监听

package com.artemis.router.listener;

import javax.annotation.Resource;
import javax.servlet.annotation.WebListener;
import javax.servlet.http.HttpSession;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;

import com.artemis.router.entity.ArUser;
import com.artemis.router.service.system.ArUserService;
import com.artemis.router.util.StaticValues;

/**
 * session 监听器
 *  
 * @author zyp
 * @time 2017年11月27日下午4:03:48
 *
 */
@WebListener
public class SessionListener implements HttpSessionListener {

	@Resource
	private ArUserService arUserService;
	
	@Override
	public void sessionCreated(HttpSessionEvent sessionEvent) {
	}
	
	@Override
	public void sessionDestroyed(HttpSessionEvent sessionEvent) {
		HttpSession session = sessionEvent.getSession();
		ArUser user = (ArUser)session.getAttribute(StaticValues.USERSESSIONKEY);
		if(user != null){
			ArUser arUser = arUserService.findById(user.getId());
			if(arUser != null){
				arUser.setState(0);
				arUserService.edit(arUser);
			}
			
		}
	}
}

任务是,当不同ip登录同一账号时,其中一个账号退出,用户状态改为未登录。
登录成功时,状态改为已登录;
SpringBoot监听_第1张图片
有用户点击退出时,状态改为未登录,并没有判断其他用户时否是已登录状态。
SpringBoot监听_第2张图片
解决方案:将用户表加一属性,用于记录已登录用户个数,当退出时-1,知道改值为0时,将用户状态改为未登录。但是当关机或断电时,并不会进行请求退出接口-1,所以此时可以等session失效时(30min)进行-1,只不过若用户在30分钟内再进行登录,可能会出问题。

你可能感兴趣的:(后端)