servlet-api.jar中提供了监听类
HttpSessionListener,主要方法有两个,sessionCreated、sessionDestroyed,根据方法名就能明白是监听session的创建和销毁。
以下是示例:
package com.test;
import javax.servlet.http.HttpSession;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;
public class SessionTestListener implements HttpSessionListener {
public void sessionCreated(HttpSessionEvent event) {
HttpSession session = event.getSession();
System.out.println("session Created: " + session);
}
public void sessionDestroyed(HttpSessionEvent event) {
System.out.println("session Destroyed.");
}
}
方法里可以写一些tracking的逻辑,也可以累计登陆次数等等。另外别忘了在web.xml里注册这个监听类(具体代码略)。
--------------------------------
来说说在用到这个监听类的一些总结。首先不可避免的要在sessionCreated方法中想要取得request对象(进而取得用户ip,浏览器等属性),但是HttpSessionEvent显然直接取不到request对象。
研究了下,发现spring(主要是context jar包)提供了监听类:
RequestContextListener,可直接配在web.xml中,通过这个监听器,可以直接拿到request上下文。示例如下:
HttpServletRequest request = ((ServletRequestAttributes)RequestContextHolder.getRequestAttributes()).getRequest();
System.out.println(request.getHeader("user-agent"));
--------------------------------
另外,在sessionCreated虽然能取得request对象,但千万不能写request.getSession(true)类似的方法,这样会引起死循环,理由是sessionCreated监听session被创建时,此时的session还没有完全被建立,因为用request.getSession(true)并不能拿到我们想要的那个session实例(大家都知道request.getSession(true) 表示获取session对象,若session不存在则会再创建)。
于是就会悲剧的陷入:监听方法中用request取得session,没拿到,创建session,监听方法又生效,生效后继续取得session,没拿到,创建session... 这样的循环中。
综上,session实例应从HttpSessionEvent拿。
分享到:
相关推荐
用户登录时,调用LoginServlet,将用户名写入application的在线用户列表中,用户退出时,调用LogoutServlet,调用session.invalidate(),交给HttpSessionListener的sessionDestroyed()方法,将用户从在线列表中删除。...
主要介绍了Spring boot通过HttpSessionListener监听器统计在线人数的实现代码,非常不错,具有参考借鉴价值,需要的朋友可以参考下
本次工程的目标是学习监听器,掌握监听三个对象的创建和销毁方法。 三个对象:rquest,session,...1.自定义实现三个监听器的类 2.使用注解的方法注册监听器 3.部署工程并运行,在控制台会输出相应的信息
本文介绍了Listener以下几个方面的内容: · Listener的定义与作用 · Listener的分类与使用 ServletContext监听 Session监听 Request监听 · Listener的应用实例 利用HttpSessionListener统计...
jsp中唯一登录,使用session控制.
用HttpSessionListener实现在线人数和历史访问量的统计
使用SessionListener+持久化Session+Springmvc拦截器实现单点登录
HttpSessionListener 和HttpSessionBindingListener的区别 HttpSessionBindingListener单点登录。
jsp 统计在线人数实例,是个完整的项目实例,部署即可查看效果! 通过使用:HttpSessionListener、HttpSessionBindingListener来实现. valueBound 方法登录触发。 valueUnbound 方法退出触发。
您好,请访问:http://msdn.microsoft.com/zh-cn/library/aa478989.aspx [^] Yours Farhad。
实现在线人的显示,通过实现ServletContenxListener,HttpSessionListener,HttpSessionAttributeListener来实现在线人的展示
主要介绍了java 在Jetty9中使用HttpSessionListener和Filter的相关资料,需要的朋友可以参考下
关于Servlet监听器的几个例子,用于统计在线人数等等
8. 配置listener监听器 8.1. 使用HttpSessionListener 8.2. 使用HttpSessionBindingListener 9. 封装taglib组件 9.1. 用taglib实现循环 9.2. 关于jstl 10. 综合电子留言板 10.1. 电子留言板用户指南 10.2. ...
The doFilter method of the Filter is called by the container each time a request/response pair is passed through the chain due to a client request for a resource at the end of the chain. doGet...
public class AmpList implements ServletContextListener,HttpSessionListener,HttpSessionAttributeListener { private ServletContext application=null; public void contextInitialized(ServletContext
springBoot Guava Cache(java工具类集的基础库,注册key的绑定) ... ...Nginx:反向代理服务器,Nginx搭建支持用户头像等静态资源的访问 ...Spring Admin(外部监控)、Spring ...HttpSessionListener监听器统计系统当前在线人数
public class DialogHttpSessionListner implements HttpSessionListener { private static Map, HttpSession> httpssessionmap = new Hashtable, HttpSession>(); // private UserVo uservo=new UserVo(); ...
此类通过监听器实现了在线人数统计,其原理很简单,就是每当增加一个HttpSession时就触发了实现HttpSessionListener接口的类的SessionCreated()方法,使在线人数加1....
基于Spring+Struts2+ibatis框架,利用 HttpSessionBindingListener接口进行监听,实现防止异地登录,配有全部代码及sql数据库表