码迷,mamicode.com
首页 > 其他好文 > 详细

关于单用户登录

时间:2015-05-15 13:50:17      阅读:196      评论:0      收藏:0      [点我收藏+]

标签:

闲的蛋疼,自己弄了个单用户登录,第二次登录可以把第一次登录的用户挤下去...

先上login的代码:

//...登录验证成功后...
//这里获得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来保存登录用户

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

然后需要判断在redis中是否存在,因为做的是第二次登录把第一次登录挤下去,那就把保存的对象中uuid更新一下,更新到最新,如果不更新的话就变成:第一个用户登陆在线后,同账号无法登录了.. 

接下来是过滤:

//获得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重启啊宕机啊可能会造成这情况吧,加个验证).

主要判断一下uuid是否一致就可以了,因为登录时我们把生成的最新的uuid放到缓存里了,如果不一致说明这个账号在别的地方登录过了,然后就可以做其他的操作了.

最后,销毁session时:

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销毁时把缓存删一下...貌似不删也行,不过会一直留在缓存里面...



关于单用户登录

标签:

原文地址:http://my.oschina.net/u/2358837/blog/415268

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!