1、创建一个session的监听器
import java.util.HashMap;
import javax.servlet.http.HttpSession;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;
import com.rails.system.model.manage.Users;
//实现HttpSessionListener接口的方法
public class SessionListener implements HttpSessionListener {
public static HashMap sessionMap = new HashMap();
//初始化
public void sessionCreated(HttpSessionEvent hse) {
HttpSession session = hse.getSession();
}
//销毁
public void sessionDestroyed(HttpSessionEvent hse) {
HttpSession session = hse.getSession();
this.DelSession(session);
}
//清除session的方法
public static synchronized void DelSession(HttpSession session) {
if (session != null) {
// 删除单一登录中记录的变量
if (session.getAttribute("users") != null) {
Users user = (Users) session.getAttribute("users");
SessionListener.sessionMap.remove(user.getLogonId());
}
}
}
}
2、在数据库中建一个表,一个列是主键,一个列是0或1。0:关闭,1:开启。
ID | CHOOSEN |
主键 | 认证——0:关闭,1:开启。 |
3、完善dao,service及其实现类的 update、和select相关全部功能。
注?:2、3步骤过于简单无赘述。
4、Controller中添加:前一个用户登出的方法
/**
* 强制前一个用户退出
* @param uanme
*/
public static void forceLogoutUser(String uanme) {
// 如果在之前的session中取到了,证明是重复登录
if (SessionListener.sessionMap.get(uanme) != null) {
//调用1步骤的Session监听器
HttpSession hs = (HttpSession) SessionListener.sessionMap.get(uanme);
SessionListener.sessionMap.remove(uanme);
Enumeration e = hs.getAttributeNames();
while (e.hasMoreElements()) {
String sessionName = (String) e.nextElement();
// 清空session
hs.removeAttribute(sessionName);
}
}
}
5、Controller中添加:更新用户状态
public void updateUserLogin(HttpSession session, Users user) throws Exception {
// 如果在之前的session中取到了,证明是重复登录
if (null != SessionListener.sessionMap.get(user.getLogonId())) {
// 调用4中的方法,前一个登录的用户session销毁
forceLogoutUser(user.getLogonId());
// 添加本次登录用户的 帐号
SessionListener.sessionMap.put(user.getLogonId(), session);
} else {
// 以用户id为key键存入map中,以判断下一次登录的人
SessionListener.sessionMap.put(user.getLogonId(), session);
}
}
6、在控制登录的Controller的方法中添加代码
//获取用户登录名保存到session中,user是方法中的形式参数
request.getSession().setAttribute("uname", user.getLogonId().toString());
//声明一个list父类,实例化一个ArrayList子类
List<Map<?,?>> list = new ArrayList<Map<?,?>>();
//使用之前2、3定义的查询方法,获取CHOOSEN是0还是1,如果是0则不启动,1就启动
list =XXXService.getChoosen();
//认证
String choosen="";
//foreach取到choosen的值,key是数据库的列名
for (Map<?, ?> map : list) {
choosen= map.get("CHOOSEN").toString();
}
if("1".equals(choosen)){//若认证状态为1:开启状态
//启用登录认证方法
updateUserLogin(session,user);
}
7、手动开启或关闭用2、3步骤的update方法即可。新建页面实现。