要查看 在线 人数..
使用 application 进行 用户UserId 进行存储.
1.需要自己实现 一个 SessionListener.
根据自己需要配置.
<session-config> <session-timeout>3</session-timeout> </session-config>
public interface HttpSessionListener extends EventListener { public abstract void sessionCreated(HttpSessionEvent httpsessionevent); public abstract void sessionDestroyed(HttpSessionEvent httpsessionevent); }
当session失效 的时候 .将 application 里面的值 清除.
SessionSync implements HttpSessionListener { public void sessionDestroyed(HttpSessionEvent sessionEvent) { //利用会话ID标示特定会话 System.out.println("Destroy a session:" + sessionEvent.getSession().getId()); ServletContext application = sessionEvent.getSession() .getServletContext(); application.removeAttribute("sessionId_"+sessionEvent.getSession().getId()); } ...... }
格式是 "sessionId_" + session id
同样的代码也要添加到 注销的里面.
注销的时候页面清除 application 里面的存储.
application.removeAttribute("sessionId_"+request.getSession().getId());
2.登录的时候.
登录成功添加 application 里面的存储.
//登录成功.将sessionId和工号放到application里面. application.setAttribute("sessionId_"+request.getSession().getId(),yourUserId); response.sendRedirect("main.jsp");//
3.查看在线列表.
直接访问 application 里面的值. 因为前面添加了 sessionId 这样可以把其他 application 值过滤.
查看时候调用..
try { Enumeration names = application.getAttributeNames(); while (names.hasMoreElements()) { String name = (String) names.nextElement(); //判断.必须有一个前缀.sessionId_.以区分其他application变量. if (null != name && name.indexOf("sessionId_") == 0) { out.println("id:" + name + " == " + application.getAttribute(name)); } } } catch (Exception e) { }
就可以看到在线列表了.
本地测试和想的是一样的.