Listener 用于监听 Java Web 程序中的事件。列如创建、修改、删除 Session、request、context等,并触发相应的事件。合理利用监听器,可以用很少的代码实现想要的效果。
监听器需要在部署的web 应用程序中配置,可以使用注解WebListener,或者通过 ServletContext 的 addListener 方法,也可以在配置文件web.xml 中通过listener来配置。
监听器的分类
这是总结了 Java EE8的Listener。
监听对象的创建与销毁
HttpSessionListener、ServletContextListener、ServletRequestListener 分别用于监控Session、context、request的创建与销毁。触发时机通过实现接口后观察需要实现的方法名称就能看出来。
监听对象的属性变化
用于监听Session、context、request 的属性变化,接口名称格式为 xxxAttributeListener,包括HttpSessionAttributeListener、ServletContextAttributeListener、ServletRequestAttributeListener。当向被监听对象中添加、更新、移除属性时,会分别执行xxxAdded()、xxxReplaced()、xxxRemoved() 方法。
监听Session 内的对象
有两种 Listener 监听 Session 内的对象,分别是 HttpSessionBindingListener 与 HttpSessionActivationListener。它们的触发时机分别为:
- HttpSessionBindingListener: 当对象被放到 Session 里 执行 valueBound 方法;当对象被从 Session 里移除时执行 valueUnbound 方法,对象必须实现该 Listener 接口。
- HttpSessionActivationListener: 服务器关闭时,会将 Session 里的内容 保存到硬盘上,这个过程叫做钝化。服务器重新启动时,会将 Session里的内容从硬盘上重新加载。当 Session 里的对象被钝化时会执行 sessionWillPassivate 方法,当对象被重新加载时执行 sessionDidActivate 方法,对象必须实现该接口。
另外还有一种监听器 HttpSessionIdListener,文档是这样解释的:Interface for receiving notification events about HttpSession id changes。也就是监听session id 的改变。可我实验了这代码并没有什么用。以下是我修改session id 的代码:
<%
String id = session.getId();
//application.addListener(SessionIdChangeListener.class);
session.invalidate();
Cookie[] cookies = request.getCookies();
Cookie cookie = null;
for(Cookie c : cookies){
if(c!=null)
out.println(c.getName());
if(c.getName().equals("JSESSIONID"))
cookie = c;
}
cookie.setMaxAge(0);
//response.addCookie(cookie);
out.println(session.getId());
%>
我想了下,虽然客户每次请求,服务器都会重新标识用户,也就是创建新的session,但在服务器端,此次请求段session 的id还是不变的。还有个原因,可能就是 Tomcat 并没有实现这个监听器的代码。这一段只是个人做的总结 ,在网上也没有查到相关资料,有清楚的还望能够指点一二。