本节主要介绍session的一些小知识。
1、登录的时候根据session验证是否登录
public class LoginSessionListener implements HttpSessionListener {
// 保存 sessionId和userName 的映射(sessionid,userName)
public static Map hUserName = new ConcurrentHashMap();
// 集合对象,保存session 对象的引用(sessionid,session)
public static Map htsession = new ConcurrentHashMap();
//HttpSessionListener 实现类
public void sessionCreated(HttpSessionEvent se) {}
//登录超时自动执行这个方法 HttpSessionListener 实现类
public void sessionDestroyed(HttpSessionEvent se) {
hUserName.remove(se.getSession().getId());
htsession.remove(se.getSession().getId());
se.getSession().invalidate(); //清空这个session
}
//将第一个已经登录的用户踢下线调用的方法
public static boolean kickFirstOper(HttpSession session, String nUserName){
boolean flag=false;
if (hUserName.containsValue(nUserName)) {
flag = true;
Iterator iter = hUserName.entrySet().iterator();
while (iter.hasNext()) {
Map.Entry entry = (Map.Entry) iter.next();
Object key = entry.getKey();
Object val = entry.getValue();
if (((String) val).equals(nUserName)) {
iter.remove();
HttpSession ses = (HttpSession) htsession.get(key);
if (session.getId().equals(((HttpSession) htsession.get(key)).getId())) {//是同一台机子登录
htsession.remove(key); //直接就把MAP的当前记录给清了
hUserName.remove(key);
//
ses.invalidate();
hUserName.put(session.getId(), nUserName);
htsession.put(session.getId(), session);
}else{ //不是同一台机子登录 先把前面的用户T了 然后把新用户的记录放进MAP
htsession.remove(key);
hUserName.remove(key);
ses.invalidate(); //把前面登录的那个操作员session销毁
hUserName.put(session.getId(), nUserName);
htsession.put(session.getId(), session);
}
break;
}
}
}
return flag;
}
}
这是一个简单的登录时,验证是否已经登录的类,登录了就销毁前一个人的session,然后把新登录的放入。
主要用这个方法ses.invalidate()来清空session
2、struts拦截器拦截是否登录
String s = String.valueOf(httpservletrequest.getSession().getAttribute("regNo"));
在拦截器中从session中拿登录用户名,如果 s为空,则session为空,未登录或被挤下线,重新登录。