关于单用户登陆

闲的蛋疼,本身弄了个单用户登陆,第二次登陆能够把第一次登陆的用户挤下去...java

先上login的代码:ajax

//...登陆验证成功后...
//这里得到uuid
String uuid = super.getUUID();
//保存登陆用户的数据
LoginUser login = new LoginUser();
login.setId(user.getId());
login.setAccount(user.getAccount());
login.setRealName(user.getRealName());
login.setUuid(uuid);
	
//设置cookie
CookieUtil.deleteCookie(response,request, configInfo.getAdminCookieName());
CookieUtil.addCookie(response, configInfo.getAdminCookieName(), uuid);

//取得redis key
String key = configInfo.getRedisSessionListKey() + login.getAccount();
			
//缓存中是否存在
if(redisClient.isExist(key)){
    //从缓存删除
    redisClient.del(key);
}
redisClient.setObject(key, login, 0);

//登陆成功
request.getSession().setAttribute(configInfo.getAdminSessionName(), login);

这里我用了redis来保存登陆用户redis

首先,先生成uuid放到cookie,session和缓存里面,方便在后面验证,spring

而后须要判断在redis中是否存在,由于作的是第二次登陆把第一次登陆挤下去,那就把保存的对象中uuid更新一下,更新到最新,若是不更新的话就变成:第一个用户登录在线后,同帐号没法登陆了.. json

接下来是过滤:缓存

//得到cookie
String uuid = CookieUtil.getCookieValue(httpRequest, configInfo.getAdminCookieName());
LoginUser user = (LoginUser)httpRequest.getSession().getAttribute(configInfo.getAdminSessionName());
String uri = httpRequest.getRequestURI();

String redisSessionKey = configInfo.getRedisSessionListKey() + user.getAccount();
//单用户登陆验证
if(redisClient.isExist(redisSessionKey)){
	LoginUser login = (LoginUser) redisClient.getObject(redisSessionKey);
	//这里判断redis中的用户的uuid是否和cookie里的一致
	if(!login.getUuid().equals(uuid)){
		//后台ajax请求
		if(uri.contains("/json/")){
			//直接中断
		    return;
		}
    		//与当前id不一样,说明再其余地方登陆过,因此返回从新登陆
		httpResponse.sendRedirect("/" + configInfo.getProjectName() + "/main.jsp");
		    return;
	}
}else{
	//用户不在缓存,返回从新登陆
	httpResponse.sendRedirect("/" + configInfo.getProjectName() + "/index.jsp");
	return;
}

首先判断一下缓存中是否有当前用户(通常状况下有的,可是redis重启啊宕机啊可能会形成这状况吧,加个验证).cookie

主要判断一下uuid是否一致就能够了,由于登陆时咱们把生成的最新的uuid放到缓存里了,若是不一致说明这个帐号在别的地方登陆过了,而后就能够作其余的操做了.session

最后,销毁session时:jsp

public class AppSessionListener implements HttpSessionListener {
	
	@Override
	public void sessionCreated(HttpSessionEvent event) {
		System.out.println("Session建立");
	}

	@Override
	public void sessionDestroyed(HttpSessionEvent event) {
		System.out.println("Session销毁");
		//得到spring中的bean
		ApplicationContext ctx = WebApplicationContextUtils.getRequiredWebApplicationContext(event.getSession().getServletContext());
		RedisClient redis = ctx.getBean(RedisClient.class);
		ConfigInfo configInfo = ctx.getBean(ConfigInfo.class);
		
		HttpSession session = event.getSession();
		//得到要销毁的用户
		LoginUser user = (LoginUser)session.getAttribute(configInfo.getAdminSessionName());
		
		if(user != null ){
			String key = configInfo.getRedisSessionListKey() + user.getAccount();
			if(redis.isExist(key)){
				redis.del(key);
				System.out.println("删除缓存...");
			}
		}
		
	}
}

在session销毁时把缓存删一下...貌似不删也行,不过会一直留在缓存里面...ide

相关文章
相关标签/搜索