实现网站的单例登录:
1, 在用户表里增加一个判断登录状态的字段,如 loginStatus 0,表示未登录,1,表示已登录。
2, 当用户登录时查询此属性,如果为 0 可登录,如果是 1 表示已有人登录,不可在登录。
3, 用户如果已登录,将loginStatu为1的用户实例放入到 Session 中。
4, 当用户点击后台退出按钮时,我们可以update用户实例的loginStatus 为 0。此为正常流程。
5, 但如果用户没有点击后台退出按钮,直接关闭浏览器退出,该如何办。??
解决方案:
使用 HttpSessionListener 监听
A..服务器 会在每次新的会话(客户端打开一个新的页面)时 产生一个带有唯一ID的默认Session,并触发 HttpSessionListener 的 public void sessionCreated(HttpSessionEvent event) 方法。
B..当默认Session过期时触发HttpSessionListener的 public void sessionDestroyed(HttpSessionEvent event) 方法。
使用代码如下:
public class MySessionListener implements HttpSessionListener {
//默认session创建时调用此方法。
public void sessionCreated(HttpSessionEvent event) {
//得到session
HttpSession session=event.getSession();
}
//默认session销毁时调用此方法。
public void sessionDestroyed(HttpSessionEvent event) {
//得到session
HttpSession session=event.getSession();
//根据admin取出放置在session里面的用户的实例。
Object object=session.getAttribute(admin);
if(object!=null){
Admin admin=(Admin)object;
if(admin.getLoginStatus()==1){
admin.setLoginStatus(0);//登录状态:0,未登录。1,已登录。
//调用数据库链接更新Admin的状态.
}
}
}
}
登录部分代码如下:
adminCheck.setLoginStatus(1);//1表示登录状态。
this.adminManagerImp.updateAdmin(adminCheck);
session.put("admin", adminCheck);
最后需要注意的:
如果服务器意外重启,应在服务器重启后自动更新用户的登录状态。!!!