当用户在一个浏览器上登录未退出,在另一个浏览器登录将会使之前的登录失效
思路:将账户和会话的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对象中的数据在项目的任何地方都可以使用,所有登录当前项目的用户都可以向里面存放数据,数据的有效期到项目停止运行为止。
由于该对象可以在任何地方使用,并且他的数据在项目运行期都有效,所以我们通过它来事项单态登录。