通过HttpSessionListener 实现 在线用户 .

要查看 在线 人数..

 

使用 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) {
	}

 就可以看到在线列表了.

 

本地测试和想的是一样的.

 

上一篇:PHP函数运用之:利用字符串函数来提取文件的扩展名


下一篇:设计模式(二十四) 访问者模式