做项目时有需要做一个运行监控功能,主要监控用户在线的信息,主要通过用户登录和退出时更新数据库中的信息来达到这个目的,但是会出现用户登录后直接关闭浏览器的非法退出操作,这样系统是不知道该用户已经退出的,因此做一个当会话失效时直接更新用户为离线状态,具体如下:
1.实现HttpSessionBindingListener接口来监控会话的 创建和失效。
package com.ctis.ta.web.servlet;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Hashtable;
import javax.servlet.ServletContext;
import javax.servlet.http.HttpSession;
import javax.servlet.http.HttpSessionBindingEvent;
import javax.servlet.http.HttpSessionBindingListener;
import org.springframework.web.context.support.WebApplicationContextUtils;
import com.ctis.ta.dict.SessionStatus;
import com.ctis.ta.dto.TaLoginUserInfo;
import com.ctis.ta.web.service.AqHhglService;
public class FrontOnlineMonitor implements HttpSessionBindingListener {
public ServletContext servletContext;// servlet容器对象
String taLoginUserInfo;
public FrontOnlineMonitor(){
}
public FrontOnlineMonitor(String taLoginUserInfo, ServletContext servletContext){
super();
this.taLoginUserInfo = taLoginUserInfo;
this.servletContext = servletContext;
}
private AqHhglService getAqHhglServiceFront() {
return (AqHhglService)WebApplicationContextUtils
.getRequiredWebApplicationContext(servletContext).getBean("aqHhglService");
}
/**
* 创建Session时会调用此方法
*/
@Override
public void valueBound(HttpSessionBindingEvent e) {
HttpSession session = e.getSession();
ServletContext application = session.getServletContext();
Hashtable activeSessions = (Hashtable) application.getAttribute("activeSessions");
if (activeSessions == null){
activeSessions = new Hashtable();
}
TaLoginUserInfo sessionUser = (TaLoginUserInfo)e.getSession().getAttribute(this.taLoginUserInfo);
if (sessionUser != null){
activeSessions.put(e.getSession().getId(),sessionUser);//将sessionUser放置在hashtable里
}
application.setAttribute("activeSessions",activeSessions);
}
/*
* 会话结束或删除时会调用此方法
* @see javax.servlet.http.HttpSessionBindingListener#valueUnbound(javax.servlet.http.HttpSessionBindingEvent)
*/
@Override
public void valueUnbound(HttpSessionBindingEvent e) {
try {
HttpSession session = e.getSession();
ServletContext application = session.getServletContext();
TaLoginUserInfo sessionUser =(TaLoginUserInfo)application.getAttribute(this.taLoginUserInfo);
if (sessionUser == null){
Hashtable activeSessions = (Hashtable) application.getAttribute("activeSessions");
if (activeSessions != null){
if(activeSessions.containsKey(e.getSession().getId())){
TaLoginUserInfo logon = (TaLoginUserInfo)activeSessions.get(e.getSession().getId());
// 退出时修改数据表中的在线状态
getAqHhglServiceFront().updateSessionStatusById(logon.getTaCustomer().getId(),
SessionStatus.OFFLINE.toString());
getAqHhglServiceFront().updateSessionTcrqById(logon.getTaCustomer().getId(),
new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()));
activeSessions.remove(e.getSession().getId());
application.setAttribute("activeSessions",activeSessions);
}
}
}
} catch (Exception e1) {
e1.printStackTrace();
}
}
}
2.用户登录和退出时加入此监听类
//将监听类加入到session中才能对该session进行监听
session.setAttribute("bindingSession",new FrontOnlineMonitor(getLoginService().getTaCustomerSessionName(), this.getServletContext()));
session.removeAttribute("bindingSession");
这样在用户正常退出以及session失效时就可以捕捉到并修改用户的在线状态了。