关于单用户登录

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

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

时间: 2024-10-08 11:46:41

关于单用户登录的相关文章

ASP.NET MVC实现一个用户只能登录一次 单用户登录

现在许多网站都要求登录后才能进行进一步的操作,当不允许多用户同时登录一个帐号时,就需要一种机制,当再登录一个相同的帐号时,前面登录的人被挤下线,或者禁止后面的人登录.这里实现的是前一种功能. 网上有许多文章都有描述如何实现该功能,看过之后,想着自己也动手记录一下吧,这里是参考的原文地址:http://www.cnblogs.com/f23wangj/p/4984302.html 实现原理:在服务器端记录登录的用户ID+SessionID,当重复登录时,根据用户ID用新的SessionID替换掉旧

Asp.NET WebApi+Redis实现单用户登录实战演练

一.课程介绍 本次分享课程属于<C#高级编程实战技能开发宝典课程系列>中的一部分,阿笨后续会计划将实际项目中的一些比较实用的关于C#高级编程的技巧分享出来给大家进行学习,不断的收集.整理和完善此系列课程! 1.1.本高级系列课程适合人群如下: 1.有一定的NET开发基础并对ASP.NET WebApi.Redis.技术有一定了解和认识. 2.喜欢阿笨的干货分享课程的童鞋们. 1.2.一句话总结今天我们要解决的问题? 我们如何实现系统限制一个账号同一时刻只能一个用户账号登录使用(不能同时登录),

Django实现单用户登录

最近由于要毕业了写论文做毕设,然后还在实习发现已经好久都没有写博客了.今天由于工作需求,需要用Django实现单用户登录.大概意思就是跟QQ一样的效果,每个账号只能一个地方登录使用,限制账号的登录次数.由于用的是Django自带的认证,然后校验用户是否登录其实就是通过Session实现的.下面就简单分享一下怎么实现的吧. 单用户登录实现 在做用户登录认证的时候Django自带的有is_authenticated()方法.下面就是一个简单的认证过程. if request.user.is_auth

SpringSecurity 3.2入门(3)单用户登录

增加spring-security.xml文件配置如下 <!-- 配置SpringSecurity的http安全服务 --> <security:http auto-config="true"> <!-- 单用户登陆 --> <!-- 仅配置max-sessions="1",则第二次登录会让第一次登录失效. --> <!-- 同时配置max-sessions="1" error-if-maxi

shiro 实现单用户登录,一个用户同一时刻只能在一个地方登录

我这里 shiro 并没有集成 springMVC,直接使用 ini 配置文件. shiro.ini [main] # Objects and their properties are defined here, # Such as the securityManager, Realms and anything # else needed to build the SecurityManager authc.loginUrl = /login.jsp authc.successUrl = /w

centos 单用户登录

1.按e 编辑 2.修改启动配置,增加 init=/bin/sh 后按ctrl+x键 进入单用户模式 Ctrl+x 执行进入单用户 修改完毕后可以 执行 exec  /sbin/init 进入多用户模式 单用户模式下,很多命令需要添加绝对路径才能执行. 例如: /sbin/fdisk 单用编辑不了 fatab文件可以使用 mount -o remount,rw / 原文地址:https://www.cnblogs.com/caonw/p/11669846.html

Django学习之用户登录

前面说了,用户注册,今天我们就来说说用户登录吧.今天说的是使用Django的session功能,而不是它的auth模块,后期,如果有机会的话,我再写点auth认证登录. 其实重点就是request.session功能,默认Django就将其session功能打开了,我们仅仅需要的是配置下数据库. website/settings.py DATABASES = {    'default': {        'ENGINE': 'django.db.backends.mysql',       

用户登录测试总结

平时工作总结: 1)空白 用户名和密码均为空/用户名填写,密码为空/用户名为空,密码填写 2)错误校验 输入错误的用户名和密码/用户名错误密码正确/用户名正确密码错误 3)大小写区分(如:用户名和密码都为小写时) 用户名和密码均大写/用户名大写,密码小写/用户名小写,密码大写 4)存在空格 合法的用户名或密码前插入空格/合法的用户名或密码中间插入空格/合法的用户名或密码后插入空格 5)已注销的用户名登录 6)已禁止/锁住的用户名登录 7)长短校验 在给定的用户名和密码规则下,超出或少于指定的长度

01 | 你真的懂测试吗?从“用户登录”测试谈起

最近在极客时间上买了一个软件测试52讲的专栏,会依次分享给大家,感谢支持. 作为专栏的第一篇文章,我选择了一个你耳熟能详的“用户登录”功能作为测试对象,希望通过这样一个简单直白的功能帮助你理解如何做好测试,以及现阶段你需要加强和提高的测试技能.可能你会说,“用户登录”这个测试对象也有点太简单了吧,我只要找一个用户,让他在界面上输入用户名和密码,然后点击“确认”按钮,验证一下是否登录成功就可以了.的确,这构成了一个最基本.最典型的测试用例,这也是终端用户在使用系统时最典型的Happy Path场景