1.什么是监听器
在java企业级开发中,监听器简单来说就是根据监听的对象的变化,做出相应的行动。在java的监听器只能够,它可以监听客户端、服务端的请求,监听的对象包括ServletContext,HttpSession,ServletRequest三个对象,三个对象对应的域是application,session,request。当这些域的对象创建和销毁时都会引起监听器做出相应的反应。
2.统计在线人数业务的原理
统计在线人数,就需要使用到监听器来监听session对象的创建于销毁,之所以选择监听session对象,是因为sessio对象是由服务器自动创建的与用户相关的对象。服务器都会为每一个访问的用户都生成一个session对象来保存用户的信息。所以每创建一个session对象就可以视为一位用户在线。
所以,在代码实现上,每一次有session被创建时,在线人数+1。每一次有session被销毁时,在线人数-1。同理我们可以得出如果session被销毁时不做处理,那么统计在线人数业务就会变成统计历史访问人数。
3.实例演示
下面是一个使用监听器实现简单统计在线人数业务的源代码:
监听器源码:
public class OnlineListener implements HttpSessionListener {
// 用于统计在线人数
private int count = 0;
/**
* <li> 随用户数增加而增加
*/
public void sessionCreated(HttpSessionEvent hse) {
// session对象创建时count变量加1
count++;
// 获取容器上下文对象
ServletContext context = hse.getSession().getServletContext();
// 重置计数器值
context.setAttribute("count", new Integer(count));
}
/**
* <li> 随用户减少而减少
*/
public void sessionDestroyed(HttpSessionEvent hse) {
// session对象销毁时count变量减1
count--;
ServletContext context = hse.getSession().getServletContext();
context.setAttribute("count", new Integer(count));
}
}
统计在线人数的页面jsp源码:
<%@ page language="java" contentType="text/html; charset=utf-8"
pageEncoding="utf-8"%>
<html>
<head>
<title>首页-直接显示在线人数</title>
</head>
<body>
<h3>
当前在线人数为:
<%=application.getAttribute("count")%>
</h3>
<!--
当客户端浏览器中禁止 Cookie,Servlet 容器无法从客户端浏览器中
取得作为 Cookie 的 Session ID,
也就无法跟踪客户状态。
Java Servlet API 中提出了跟踪 Session 的另一种机制,
如果客户端浏览器不支持 Cookie,Servlet 容器可以重写客户请求的 URL,
把 Session ID 添加到 URL 信息中。
-->
<!-- 客户端直接点击链接跳转 HttpServletResponse 接口提供了重写 URL 的方法 -->
<a href="<%=response.encodeUrl("logout.jsp")%>">退出登录</a>
</body>
</html>
登出页面源码:
<%@ page language="java" contentType="text/html; charset=utf-8"
pageEncoding="utf-8"%>
<html>
<head>
<title>注销页面</title>
</head>
<body>
<!-- 直接让用户的session失效即可完成业务注销动作 -->
<%session.invalidate();%>
<h3>您已退出本系统</h3>
</body>
</html>
下面是运行效果:
在不同三个浏览器中打开该页面,可以看到当前在线人数不断增加。
现在将其他两个浏览器退出登录,现在再看当前在线人数就会减少到1。
另外,如果我们将监听器中的监听session域销毁的部分注释掉,那么此时的统计在线人数业务就变成了统计历史访问人数的业务。
我们再次运行,就在同一个浏览器中不断退出登录,可以看见在线人数不断增加。