1. 使用HttpSessionListener 编写一个OnlineUserListener。
package test; import java.util.List; import javax.servlet.ServletContext; import javax.servlet.http.HttpSession; import javax.servlet.http.HttpSessionListener; import javax.servlet.http.HttpSessionEvent; public class OnlineUserListener implements HttpSessionListener{ public void sessionCreated(HttpSessionEvent event) {} public void sessionDestroyed(HttpSessionEvent event) { HttpSession session = event.getSession(); ServletContext application = session.getServletContext();// 取得登录的用户名 String username = (String) session.getAttribute("username");// 从在线列表中删除用户名 List onlineUserList = (List) application.getAttribut("onlineUserList"); onlineUserList.remove(username); System.out.println(username + "超时退出。"); } }
OnlineUserListener实现了HttpSessionListener定义的两个方法:sessionCreated()和 sessionDestroyed()。
这两个方法可以监听到当前应用中session的创建和销毁情况。我们这里只用到 sessionDestroyed()在session销毁
时进行操作就可以。
从HttpSessionEvent中获得即将销毁的session,得到session中的用户名,并从在线列表中删除。最后一句向
console打印一条信息,提示操作成功,这只是为了调试用,正常运行时删除即可。
为了让监听器发挥作用,我们将它添加到web.xml中:
<listener>
<listener-class>anni.OnlineUserListener</listener-class>
</listener>
以下两种情况下就会发生sessionDestoryed(会话销毁)事件:
执行session.invalidate()方法时。
既然LogoutServlet.java中执行session.invalidate()时,会触发sessionDestory()从在线用户列表中清除当前用户,我
们就不必在LogoutServlet.java中对在线列表进行操作了,所以LogoutServlet.java的内容现在是这样。
public void doGet(HttpServletRequest request,HttpServletResponse response) throws ServletException, IOException { // 销毁session request.getSession().invalidate(); // 成功 response.sendRedirect("index.jsp"); }
如果用户长时间没有访问服务器,超过了会话最大超时时间,服务器就会自动销毁超时的session。
会话超时时间可以在web.xml中进行设置,为了容易看到超时效果,我们将超时时间设置为最小值。
<session-config>
<session-timeout>1</session-timeout>
</session-config>
时间单位是一分钟,并且只能是整数,如果是零或负数,那么会话就永远不会超时。
为了验证OnlineUserListener是否能正常执行,我们可以登录两个用户,其中一个点击注销,另一个等待一分钟,然后可
以在console中看到输出的信息。
2. 使用HttpSessionBindingListener
HttpSessionBindingListener虽然叫做监听器,但使用方法与HttpSessionListener完全不同。我们实际看一下它是如何使用的。
我们的OnlineUserBindingListener实现了HttpSessionBindingListener接口,接口中共定义了两个方法:
valueBound()和valueUnbound(),分别对应数据绑定,和取消绑定两个事件。
所谓对session进行数据绑定,就是调用session.setAttribute()把 HttpSessionBindingListener保存进session中。
我们在LoginServlet.java中进行这一步。
// 把用户名放入在线列表
session.setAttribute("onlineUserBindingListener", new OnlineUserBindingListener(username));
就是HttpSessionBindingListener和 HttpSessionListener之间的最大区别:
HttpSessionListener只需要设置到web.xml中就可以监听整个应用中的所有session。
HttpSessionBindingListener必须实例化后放入某一个session中,才可以进行监听。
从监听范围上比较,HttpSessionListener设置一次就可以监听所有 session,
HttpSessionBindingListener通常都是一对一的。
正是这种区别成就了HttpSessionBindingListener的优势,我们可以让每个listener对应一个username,
这样就不需要每次再去session中读取username,进一步可以将所有操作在线列表的代码都移入listener,更容易维护。
valueBound()方法的代码如下:
public void valueBound(HttpSessionBindingEvent event) { HttpSession session = event.getSession(); ServletContext application = session.getServletContext(); // 把用户名放入在线列表 List onlineUserList = (List) application.getAttribute("onlineUserList");// 第一次使用前,需要初始化 if (onlineUserList == null) { onlineUserList = new ArrayList(); application.setAttribute("onlineUserList", onlineUserList); } onlineUserList.add(this.username); }
username已经通过构造方法传递给listener,在数据绑定时,可以直接把它放入用户列表。
与之对应的valueUnbound()方法,代码如下:
public void valueUnbound(HttpSessionBindingEvent event) { HttpSession session = event.getSession(); ServletContext application = session.getServletContext();// 从在线列表中删除用户名 List onlineUserList = (List) application.getAttribute("onlineUserList"); onlineUserList.remove(this.username); System.out.println(this.username + "退出。"); }
这里可以直接使用listener的username操作在线列表,不必再去担心session中是否存在username。
valueUnbound的触发条件是以下三种情况:
执行session.invalidate()时。
session超时,自动销毁时。
执行session.setAttribute("onlineUserListener", "其他对象");
或session.removeAttribute("onlineUserListener");将listener从session 中删除时。
因此,只要不将listener从session中删除,就可以监听到session的销毁。
相关推荐
HttpSessionListener 和HttpSessionBindingListener的区别 HttpSessionBindingListener单点登录。
jsp 统计在线人数实例,是个完整的项目实例,部署即可查看效果! 通过使用:HttpSessionListener、HttpSessionBindingListener来实现. valueBound 方法登录触发。 valueUnbound 方法退出触发。
用HttpSessionListener实现在线人数和历史访问量的统计
主要介绍了Spring boot通过HttpSessionListener监听器统计在线人数的实现代码,非常不错,具有参考借鉴价值,需要的朋友可以参考下
基于Spring+Struts2+ibatis框架,利用 HttpSessionBindingListener接口进行监听,实现防止异地登录,配有全部代码及sql数据库表
用户登录时,调用LoginServlet,将用户名写入application的在线用户列表中,用户退出时,调用LogoutServlet,调用session.invalidate(),交给HttpSessionListener的sessionDestroyed()方法,将用户从在线列表中删除。...
主要介绍了java 在Jetty9中使用HttpSessionListener和Filter的相关资料,需要的朋友可以参考下
您好,请访问:http://msdn.microsoft.com/zh-cn/library/aa478989.aspx [^] Yours Farhad。
jsp中唯一登录,使用session控制.
8.2. 使用HttpSessionBindingListener 9. 封装taglib组件 9.1. 用taglib实现循环 9.2. 关于jstl 10. 综合电子留言板 10.1. 电子留言板用户指南 10.2. 数据库设计 10.3. 功能设计 10.3.1. 用户管理 10.3.2. ...
HttpSessionBindingListener HttpSessionContext HttpSessionEvent HttpSessionListener HttpUtils RequestDispatcher Servlet ServletConfig ServletContext ServletContextAttributeEvent ...
javax.servlet.Filter javax.servlet.Servlet ...javax.servlet.http.HttpSessionBindingListener javax.servlet.http.HttpSessionAttributeListener javax.servlet.http.HttpSessionActivationListener
实现在线人的显示,通过实现ServletContenxListener,HttpSessionListener,HttpSessionAttributeListener来实现在线人的展示
用户注销 非正常退出 session失效 三种情况来进行 控制 分别使用了两种方式 进行了实现1:不修改数据库使用HashMap+HttpSessionListener 2:给数据库添加online列 使用(数据库脚本包含在内)HashMap+...
使用SessionListener+持久化Session+Springmvc拦截器实现单点登录
springBoot Guava Cache(java工具类集... ... ...Nginx:反向代理服务器,Nginx搭建支持用户头像等静态资源的访问 ...Spring Admin(外部监控)、Spring Actuator(内部监控平台) ...HttpSessionListener监听器统计系统当前在线人数
javax.servlet.http.HttpSessionBindingListener.class javax.servlet.http.HttpSessionBindingEvent.class javax.servlet.http.HttpSessionEvent.class javax.servlet.http.HttpSession.class javax.servlet....
public class DialogHttpSessionListner implements HttpSessionListener { private static Map, HttpSession> httpssessionmap = new Hashtable, HttpSession>(); // private UserVo uservo=new UserVo(); ...
企业drp系统经典实现。... * HttpSessionListener * HttpSessionAttributeListener * ServletContextListener v3.1 * JfreeChart的应用 v3.2 * 采用Ajax实现下拉列表的联动 v3.3 * 验证码的使用
此类通过监听器实现了在线人数统计,其原理很简单,就是每当增加一个HttpSession时就触发了实现HttpSessionListener接口的类的SessionCreated()方法,使在线人数加1....