HttpSessionBindingListener
监听自己何时被帮到session上,何时解绑了
举一个例子
有一个User类,现在User类对象想知道自己是否被添加到session中或被从session移除。
public class User implements HttpSessionBindingListener {
@Override
public void valueBound(HttpSessionBindingEvent event) {
System.out.println("被添加到了session中");
}
@Override
public void valueUnbound(HttpSessionBindingEvent event) {
System.out.println("被session移除了");
}
}
然后写一个添加jsp和删除jsp:
<%
User user = new User();
session.setAttribute("user",user);
%>
<%
session.removeAttribute("user");
%>
控制台输出如下:
该监听器实际上是JavaBean对session的一个监听。被观察者(事件源)是session,事件是添加/删除该JavaBean对象,所以合起来就是JavaBean对象
对session添加或删除该JavaBean
进行监听,如果发生,则做出相应的操作。
HttpSessionActivationListener
先提两个概念:session的序列化、session的钝化和活化
session存在于一次会话当中,在浏览器被关闭时,就会被销毁。但有的时候我们想再打开浏览器时,仍然可以访问到上次session中的数据,这就需要用到session的序列化。
而Tomcat服务器,确实也帮我们实现了这一点。当我们关闭服务器时,服务器会把所有的session都通过序列化写入到客户端的硬盘当中(apache-tomcat-9.0.22\work\Catalina\localhost\项目目录),等到下一次访问时,再反序列化到服务器中。
有的时候用户太多,服务器端的session太多了。我们就会把一些不活跃的session,先序列化到硬盘中,而当该session又进行操作时,又进行活化——即反序列化到服务器中。
钝化的时间可以在某个项目的conf目录下的context.xml中添加如下配置(该配置是全局配置):
这里表示经过1分钟,session就会被钝化。
HttpSessionActivationListener的作用就是何时被钝化了,何时被活化了。
还是写一个User类,并实现该接口:
public class User implements HttpSessionActivationListener, Serializable {
@Override
public void sessionWillPassivate(HttpSessionEvent se) {
System.out.println("被钝化了");
}
@Override
public void sessionDidActivate(HttpSessionEvent se) {
System.out.println("被活化了");
}
}
这里可以看到,除了实现HttpSessionActivationListener接口,还实现了序列化接口。这是因为session被钝化时会被序列化到硬盘中,而如果User类不实现序列化,就不能被session带着一起到硬盘。(String是实现了序列化接口的,所以session中存字符串可以直接序列化)。
我们访问一个浏览器,然后等待一分钟,就可以看见控制台输出“被钝化了”,而当再次访问时,就会输出“被活化了”。