java servlet 通过上下文对象ServletContext实现单态登录

当用户在一个浏览器上登录未退出,在另一个浏览器登录将会使之前的登录失效

思路:将账户和会话的session存储到上下文对象ServletContext中,每次登录,都通过用户名去查找ServletContext中是否已经存在与该用户对应的session
1、若存在说明有旧的登录未退出,那么就让旧的session失效(旧的登录就会失效),再将新的登录写入ServletContext中,最后完成登录。
2、若不存在,那么说明不存在旧的登录,直接将session写入到ServletContext中,再完成登录。

		//1、获取用户输入的账号和密码
		String account = request.getParameter("account");
		String password = request.getParameter("password");
		
		//2、通过账号作为查询条件到数据库中查询用户信息(这里userService 以及其中的方法需要自己实现,方法的返回结束是查询到的用户的实体类对象)
		User user = userService.findUserByAccount(account);
		
		//3、判断信息,判断数据库是否有用户输入的账号(如果没有,user为空),以及密码是否正确
		if(user !=null && password.equals(user.getPassword())) {
			//3.1、账号合法并且密码正确,向前端返回数据(返回数据方式需要自己实现)
			resultUtil.setStatus(ResultUtil.SUCCESS);
			//3.2将当前用户的信息存放到与用户浏览器对应的session
			//获取session
			HttpSession session = request.getSession();
			//存放信息  记录用户登录
			session.setAttribute("uid", user.getId());

			//3.3实现单态登录
			//3.3.1、获取上下文对象
			ServletContext context = request.getServletContext();
			//3.3.2、通过账号在上下文对象中去获取session(若不存在就为null)
			Object object = context.getAttribute(account);
			if(object!=null) {
			//若存在,那么要先判断是否为同一浏览器上再次登录
				if(object.equals(session)) {
				//如果是同一浏览器上再次登录,那么提示重复登录
					System.out.println("重复登录");
					return;//跳转到主页面或者提示重复登录
				}
				//如果不是重复登录(换了设备或浏览器登录)
				//销毁旧的session(之前存在ServletContext中的session)
				HttpSession otherSession = (HttpSession)object;
				otherSession.invalidate();//让session过期->销毁
			}
			//将新的session写入到httpcontext中
			context.setAttribute(account, session);
		}else {
			//提示账号密码有误
			resultUtil.setStatus(ResultUtil.ERROR);
			resultUtil.setMessage("账户或者密码有误!");
		}
		//最后将反馈信息发给浏览器(发送方式需要自己实现)
		SendDataUtil.send(resultUtil, response);
}

对上下问对象ServletContext的一些了解:
ServletContext是servlet中的域对象,域对象是servlet中多种对象的总称,域表示范围。域对象表示能在一定的范围内使用的对象。
ServletContext(Servlet上下文对象):保存了当前项目的配置信息、系统信息。每一个项目都存在一个该对象,它是由服务器为项目创建的对象,可以认为一个ServletContext就代表了当前项目。ServletContext对象中的数据在项目的任何地方都可以使用,所有登录当前项目的用户都可以向里面存放数据,数据的有效期到项目停止运行为止。

由于该对象可以在任何地方使用,并且他的数据在项目运行期都有效,所以我们通过它来事项单态登录。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值