Listener之使用HttpSessionListener和HttpSessionAttributeListener

2/22/2017来源:ASP.NET技巧人气:4776

HttpsessionListener用于监听用户session的创建和销毁,实现该接口的监听器需要实现如下两个方法: 1.sessionCreated(HttpSessionEvent se):用户与服务器的会话开始,创建时触发该方法。 2.sessionDestroyed(HttpSessionEvent se):用户与服务器的会话断开,销毁时触发该方法。 HttpSessionAttributeListener则用于监听HttpSession(session)范围内属性的变化,实现该接口的监听器需要实现attributeAdded(),attributeRemoved(),attributeReplaced()三个方法。由此可见,是HttpSessionAttributeListener监听session范围内属性的改变,而ServletContextAttributeListener监听的是application范围内属性的改变。 实现HttpSessionListener接口的监听器可以监听每个用户会话的开始断开,因此应用可以通过该监听器监听系统的在线用户。 下面是该监听器的实现类。 这里写图片描述 这里写图片描述 上面的监听器实现类实现了HttpSessionListener接口,该监听器可用于监听用户与服务器之间session的开始,关闭,当用户与服务器之前的session开始时,如果该session是一次新的session,程序就将当前的session ID,用户名存入application范围的Map中;当用户与服务器之间的session关闭时,程序从application范围的Map中删除该用户的信息。通过上面的方式,application范围内的Map就记录了当前应用的所有在线用户 显示在线用户的页面代码很简单,只要迭代输出application范围的Map即可,如下 这里写图片描述 这里写图片描述 因为本机只启动了一个浏览器,如果启动了三个不同的浏览器,将会有三个模拟的用户访问该应用,所以现在只能看到一个用户的登陆信息。 需要指出的是,采用HttpSessionListener监听用户在线信息比较“粗糙”,只能监听到有多少人在线,如果应用需要监听到每个用户停留在哪个页面,本次在线的停留时间,用户的访问ip等信息,则应该考虑定时检查HttpServletRequest来实现。

问题:如何更精确地监听每个用户请求? 通过检查HttpServletRequest的做法,这种做法的思路是: 1.定义一个ServletRequestListener,这个监听器负责监听每个用户请求,当用户请求到达时,系统将用户请求的session ID,用户名,用户IP,正在访问的资源,访问时间记录下来。 2.启动一条后台线程,这条后台线程每隔一段时间检查上面的每条在线纪录,如果某条在线纪录的访问时间与当前时间相差超过了指定值,将这条在线纪录删除即可。这条后台线程应随着Web应用的启动而启动,可考虑使用ServletContextListener来完成。 下面定义一个ServletRequestListener,它负责监听每次用户请求:每次用户请求到达时,如果是新的用户会话,将相关信息插入数据表,如果是老的用户会话,则更新数据表中已有的在线记录。 这里写图片描述 这里写图片描述 接下来定义一个ServletContextListener,它负责启动一条后台线程,这条后台线程将会定期检查在线记录,并删除那些长时间没有重新请求过的记录,该代码如下: 这里写图片描述 这里写图片描述 上面的程序启动的后台线程定期检查的时间间隔为5秒,实际项目中这个时间应该适当的加大,尤其是在线用户较多时,否则应用将会频繁地检查online_inf数据表中的全部记录,这将导致系统开销过大。 还需要一个DAO类,代码如下 这里写图片描述 这里写图片描述 这里写图片描述 显示在线用户的页面十分的简单,只要查询online_inf表中全部记录,并将这些记录显示出来即可。代码如下 这里写图片描述