HttpSessionBindingListener接口在很多情况下用于在线用户人数的统计与管理。不言而喻,session是必须的,但又不想专门启动tomcat运行一个web程序来测试它的效果。那么有没有办法直接调用tomcat自己的jar包来构造一个session来实现我的目的。比如:
通过多番测试,证明上面的步骤是完全能实现的。
其实也比较简单,首先查看一下tomcat源码对应的API文档 http://tomcat.apache.org/tomcat-7.0-doc/api/index.html ,找到后缀为session的包名:org.apache.catalina.session,经查看,HttpSession的实现类为StandardSession和StandardSessionFacade,事后测试,这两个都可以用来检查HttpSessionBindingListener的监听效果。不过为满足好奇,我还是启动了tomcat,在随便一个demo的页面中写上<%=request.getSession()%>,看看tomcat默认是使用的哪个实现,结果输出 org.apache.catalina.session.StandardSessionFacade@1f6df4c 那就用它吧。
然后,就是写测试类,如下:
1.调用tomcat的某个jar,这个包就是在tomcat运行时接收远程客户端的http请求时,用来构造HttpServletRequest、HttpServletResponse、HttpSession等我们熟知的servlet API中的实现类,现在我只需要HttpSession接口的实现。
2.获得了HttpSession实例之后,我就可以用session.setAttribute()方法将HttpSessionBindingListener的实例放入session,然后又调用session.removeAttribute()删除这个属性,看看HttpSessionBindingListener的实例中相应方法是否被触发,从而实现测试目的。通过多番测试,证明上面的步骤是完全能实现的。
一、首先将tomcat安装目录下面的所有jar包引入工程(其实并非全部需要,只是为了操作简单),包括lib及bin目录下的。
二、自定义HttpSessionBindingListener的实现类import javax.servlet.http.HttpSessionBindingEvent;
import javax.servlet.http.HttpSessionBindingListener;
public class MyBindingListener implements HttpSessionBindingListener {
// 绑定与解绑定时需要操作的业务数据
private Object obj;
public MyBindingListener(Object obj) {
this.user = obj;
}
@Override
public void valueBound(HttpSessionBindingEvent event) {
System.out.println("hi...valueBound");
// process obj
}
@Override
public void valueUnbound(HttpSessionBindingEvent event) {
System.out.println("hi...valueUnbound");
// process obj
}
}
三、寻找Tomcat中的HttpSession实现类
其实也比较简单,首先查看一下tomcat源码对应的API文档 http://tomcat.apache.org/tomcat-7.0-doc/api/index.html ,找到后缀为session的包名:org.apache.catalina.session,经查看,HttpSession的实现类为StandardSession和StandardSessionFacade,事后测试,这两个都可以用来检查HttpSessionBindingListener的监听效果。不过为满足好奇,我还是启动了tomcat,在随便一个demo的页面中写上<%=request.getSession()%>,看看tomcat默认是使用的哪个实现,结果输出 org.apache.catalina.session.StandardSessionFacade@1f6df4c 那就用它吧。
然后,就是写测试类,如下:
import org.apache.catalina.core.StandardContext;
import org.apache.catalina.session.StandardManager;
import org.apache.catalina.session.StandardSession;
import org.apache.catalina.session.StandardSessionFacade;
import org.junit.Test;
public class HttpSessionBindingListenerTest {
@Test
public void test() {
StandardManager sm=new StandardManager();
sm.setContainer(new StandardContext());//添加容器
StandardSession ss=new StandardSession(sm);//构造一个session
System.out.println(ss.isValid());
ss.setValid(true);
System.out.println(ss.isValid());
//利用上面的session构造出我们需要的那个session,
//其实也可直接用上面的session测试
StandardSessionFacade session=new StandardSessionFacade(ss);
// StandardSession session=new StandardSession(sm);
// session.setValid(true);
System.out.println(session);
MyBindingListener my=new MyBindingListener(new Object());
session.setAttribute("my", my);
try {
Thread.currentThread().sleep(3000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
session.removeAttribute("my");
}
}
运行结果:
false
true
org.apache.catalina.session.StandardSessionFacade@1f6df4c
hi...valueBound
hi...valueUnbound
说明,为求简便,MyBindingListener类中的属性只是简单使用了Object类型,具体可依个人实现业务需要进行相应修改,然后在对应的触发方法中对其进行相应处理。
(来自作者博客:http://www.ichatter.cn/2013/05/24/587/)
来源:oschina
链接:https://my.oschina.net/u/88888/blog/133158