1.思路
在Java web项目中,有时需要防止用户重复登录,解决方案有多种。比如Spring security就可以防止用户重复登录。
这里给出一个简单的解决方案:在处理登录的login方法中,先查询数据库验证下该用户是否存在,如果存在 判断该登录账户是否已经锁定了, 然后从application内置作用域对象中取出所有的登录信息,查看该username账户是否已经登录,如果登录了,就友好提示下,反之表示可以登录,将该登录信息以键值对的方式保存在application中。
当用户注销时,删除application中相关数据即可。
2.示例代码
2.1 处理登录方法
@RequestMapping("/checkLogin.do")
public String checkLogin(HttpSession session, String username, String password) {
System.out.println("checkLogin.do");
UserBean user=userService.login(username,password);
if(user!=null){//登录成功
//session.getServletContext()得到时application对象
ServletContext application=session.getServletContext();
Map<String, String> loginMap = (Map<String, String>)application.getAttribute("loginMap");
if(loginMap==null){
loginMap = new HashMap<>();
}
for(String key:loginMap.keySet()) {
if (user.getUsername().equals(key)) {
if(session.getId().equals(loginMap.get(key))) {
System.out.println(username+"在同一地点多次登录!");
}else{
System.out.println(username+"异地登录被拒绝!");
session.setAttribute("tip", "该用户已经异地登录!");
return "forward:/index.jsp";
}
}
}
loginMap.put(user.getUsername(),session.getId());
application.setAttribute("loginMap", loginMap);
session.setAttribute("username",user.getUsername());
System.out.println("登录成功!");
return "redirect:/index";
}else{
//登录失败
System.out.println("登录失败!");
session.setAttribute("tip","登录失败!");
return "forward:/index.jsp";
}
}
2.2 销毁Session
package cn.hadron.servlet;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;
import java.util.Map;
/**
* Created by root on 17-9-28.
*/
public class SessionListener implements HttpSessionListener {
@Override
public void sessionCreated(HttpSessionEvent event) {
}
@Override
public void sessionDestroyed(HttpSessionEvent event) {
//在session销毁的时候 把loginMap中保存的键值对清除
String username = event.getSession().getAttribute("username").toString();
if(username!=null){
Map<String, String> loginMap = (Map<String, String>)event.getSession().getServletContext().getAttribute("loginMap");
loginMap.remove(username);
event.getSession().getServletContext().setAttribute("loginMap",loginMap);
System.out.println(username+"用户注销!");
}
}
}
2.3 web.xml
<listener>
<listener-class>cn.hadron.servlet.SessionListener</listener-class>
</listener>
2.4 登录页面
${tip}
<form action="/user/checkLogin.do" method="post">
帐号:<input type="text" name="username"><br>
口令:<input type="password" name="password"><br>
<input type="submit" value="登录">
</form>
3 测试
3.1 本地登录
注意:本地可以多次登录。
3.2 异地登录
另找一台机器测试