ServletAPI提供了大量的监听器来监听WEB应用的内部事件,以下简单利用HttpSessionListener监听器来实现监控当前网站的在线人数。
相应代码如下:
- package neo.app.servlet;
- import java.util.HashSet;
- import java.util.Map;
- import javax.servlet.ServletContext;
- import javax.servlet.http.HttpSession;
- import javax.servlet.http.HttpSessionEvent;
- import javax.servlet.http.HttpSessionListener;
- import neo.app.service.ServiceManager;
- import neo.core.Constants;
- import neo.core.bean.BeanManager;
- import org.apache.commons.logging.Log;
- import org.apache.commons.logging.LogFactory;
- /**
- * 用于记录在线人数,用户退出日志写入
- *
- */
- public class SessionListener implements HttpSessionListener {
- private final Log log = LogFactory.getLog(getClass());
- private final String COUNT_KEY = "sessions";
- /**
- * session创建时执行的方法,用户登录时执行
- */
- public void sessionCreated(HttpSessionEvent event) {
- HttpSession session = event.getSession();
- ServletContext application = session.getServletContext();
- // 在application范围由一个HashSet集保存所有的session
- HashSet sessions = (HashSet) application.getAttribute(COUNT_KEY);
- if (sessions == null) {
- sessions = new HashSet();
- application.setAttribute(COUNT_KEY, sessions);
- }
- // 新创建的session均添加到HashSet集中
- sessions.add(session);
- // 然后使用sessions.size()获取当前活动的session数,即为“在线人数”
- log.debug("sessionCreated 网站在线人数(含未登录的访问) 为:" + sessions.size());
- //由于此处无法获得登录用户的IP信息
- //用户登录日志转向到用户登录action中完成
- }
- /***
- * session销毁时执行的方法,用户主动退出/浏览器关闭Session过期 时执行
- */
- public void sessionDestroyed(HttpSessionEvent event) {
- HttpSession session = event.getSession();
- ServletContext application = session.getServletContext();
- HashSet sessions = (HashSet) application.getAttribute(COUNT_KEY);
- if (null != sessions && sessions.contains(session)) {
- Object userObj = session.getAttribute(Constants.LOGIN_USER);
- log.debug("userObj is:" + userObj);
- if (userObj != null) {//判断是否为登录后包含用户信息的数据(已经登录)
- Map userMap = (Map) userObj;
- String username = (String) userMap.get("username");
- log.debug("用户" + username + "退出");
- Long loginid = (Long) userMap.get(Constants.LOGIN_LOGID);
- //调用memberService来进行用户退出日志写入
- ((ServiceManager) BeanManager.getBean("serviceManager")).getMemberService().insertLogoutLog(loginid,
- username);
- } else {//未进行登录
- log.debug("session存在,但是尚未进行用户登录");
- }
- } else {
- //session已经不存在此退出对象了
- log.debug("session已经不存在此退出对象了");
- }
- // 销毁的session均从HashSet集中移除
- if (sessions != null) {
- sessions.remove(session);
- //更新在线人数数据
- log.debug("sessionDestroyed 网站在线人数(含未登录的访问) 为:" + sessions.size());
- }
- }
- }
当然最后别忘了在web.xml文件中对监听器进行配置,配置也很简单,如下
- <listener>
- <listener-class>neo.app.servlet.SessionListener</listener-class>
- </listener>