实现一个监听器,这个监听器的作用是监听session的创建和销毁。
写一个类,实现HttpSessionListener,实现sessionCreated() sessionDestroyed()方法。然后在web.xml里面配置这个类的包全名
<listener>
<listener-class>包全名</listener-class>
</listener>
这个类写好之后,每当用户登录的时候,就会创建session,然后触发这个监听器。执行sessionCreated方法,监听session。
当用户退出的时候销毁session,又会sessionDestroyed方法。
这有什么用呢?
统计在线人数,当前有多少会话。
session在什么时候产生的呢?怎么产生的呢?
用浏览器打开页面就会产生session,不是非要调用方法。因为session在jsp页面源码里面就已经获取了,只要请求到页面就会有session产生。
或者调用servlet的时候使用这个方法 HttpSession session = request.getSession();
我们项目对这个监听器的使用情况简介:
<listener>
<listener-class>app.util.LoginSessionListener</listener-class>
</listener>
public class LoginSessionListener extends BaseFormBean implements HttpSessionListener {
private static final long serialVersionUID = -5917966270069281361L;
//保存 userName和session 的映射(userName,session)
public static Map<String,HttpSession> hUserName = new ConcurrentHashMap<String, HttpSession>();
public void sessionCreated(HttpSessionEvent se) {
}
public void sessionDestroyed(HttpSessionEvent se) {
Iterator<Map.Entry<String,HttpSession>> iter = hUserName.entrySet().iterator();
while (iter.hasNext()) {
Map.Entry<String,HttpSession> entry = iter.next();
String key = entry.getKey();
HttpSession val = entry.getValue();
if ((val.getId()).equals(se.getSession().getId())) {
hUserName.remove(key);
break;
}
}
se.getSession().invalidate();
}
public static void putSessionMap(HttpSession session, String nUserName){
hUserName.put(nUserName, session);
createSysLogBo();
SysUserToken sysUserToken = new SysUserToken(nUserName,ESBContextListener.jvmNo);
sysLogBO.insertOrUpdateUserToken(sysUserToken);
}
/**
* 功能描述: 清空指定用户的登录状态
* @param sUserName 登录的用户名称
*/
public static void doRemove(String sUserName) {
if (hUserName.containsKey(sUserName)) {
HttpSession ses = hUserName.get(sUserName);
hUserName.remove(sUserName);
ses.invalidate();
}
}
public static boolean isOnline(String sUserName) {
return hUserName.containsKey(sUserName);
}
public static boolean isAddSessionToMap(HttpSession session,
String sUserName) {
boolean flag = false;
if (hUserName.containsKey(sUserName)) {
flag = true;
} else {
flag = false;
hUserName.put(sUserName, session);
}
return flag;
}
}
这个监听器的createSession方法没有用到,我们不监听session创建。我们这里面定义了 sessionDestroyed方法,这个方法将登陆时候存储的session取出来用sessionId和传入的session,也就是当前要退出的session对比,相等,将此session从map中移除出去。
初次之外定义了一些其他方法,比如putSessionMap,将登陆时候获得的session信息存储到map中,拿来使用。
isOnline,使用map中的session信息,和传入的比较,判断是否处于活跃状态。
总结:建立监听器后,用户退出的时候,调用userLogout销毁session。启动监听器sessionDestroyed,把session信息从map里面移除。用户登录的时候把用户名密码等在session里面存储,并把session存储到map中。中间,使用map集合来使用session信息,判断用户时候活跃,判断用户是否在线。