JavaWeb Listener之HttpSessionActivationListener ,session钝化、活化
HttpSessionActivationListener 监听HttpSession对象的活化、钝化
钝化:将HttpSession对象从内存中转移至硬盘,存储为.session文件。
活化:把HttpSession对象从持久化状态转变为运行状态(从硬盘加载到内存,恢复原样)。
@WebListener()
public class MyListener implements HttpSessionActivationListener , Serializable { public void sessionWillPassivate(HttpSessionEvent se) { //钝化时调用 //..... } public void sessionDidActivate(HttpSessionEvent se) { //活化时调用 //...... } }
session.setAttribute("myListener",new MyListener());
session.setAttribute("name","chy");
HttpSessionActivationListener和HttpSessionBindListener一样,需要放到某个session中才能监听,监听的是某个具体的session。
钝化是一种特殊的序列化,活化是一种特殊的反序列化,特殊在作用范围限定为session。
既然钝化是一种特殊的序列化,那就是说session中只有可序列化的对象才会被钝化。java自带的数据类型大多数都已implements Serializable,是可序列化的。我们自己写的实体类,需要实现Serializable接口或Externalizable接口才会被钝化。
HttpSessionActivationListener对象要放到session中,也是session中的对象,
- 如果我们写的类在实现HttpSessionActivationListener的同时,还实现了Serializable接口或Externalizable接口,钝化时这个监听器可以监听到钝化事件,调用对应的方法,活化时可以监听到活化事件,调用对应的方法。
- 如果我们写的类在实现HttpSessionActivationListener的同时,没有实现Serializable接口或Externalizable接口,则钝化时这个监听器可以监听到钝化事件,调用对应的方法,但活化时不能监听到活化事件,对应的方法不起作用。
Session钝化的配置
HttpSessionActivationListener这个监听器需要配合钝化配置使用。有2种方式可以配置钝化:
- 在tomcat -> conf -> context.xml 的<Context>中配置
- 在web下新建META-INF目录,接着在META-INF下新建context.xml:
<?xml version="1.0" ?> <Context> <Manager className="org.apache.catalina.session.PersistentManager" maxIdleSwap="2"> <Store className="org.apache.catalina.session.FileStore" directory="d:/session"> </Store> </Manager> </Context>
也是在<Context>中配置。
maxIdleSwap指定session在空闲多少分钟后(在多少分钟内没有再次使用此session),会被钝化到硬盘的.session文件中。
directory指定.session文件的位置,指定的目录不存在时会自动创建。
在tomcat中配置的是全局的,对tomcat下所有部署的WebApp都有效。
在项目中配置的,只作用于这个项目。
Eclipse会自动创建META-INF目录,但IDEA不会自动创建,需要我们需要手动在web下创建META-INF,META-INF和WEB-INF同一级别。
Session钝化配置,监管的是所有的session对象,哪个session在指定时间内没被使用,就钝化这个session到硬盘,一个session一个.session文件。
当一个session对象钝化到.session文件后,之后再次钝化时,还是钝化到同一个.session文件中(先删除原有内容,再写入)。
HttpSessionActivationListener监听的是某个具体的session,只监听所在session的钝化、活化。
监听器只起到监听作用,并不能实现钝化,监听器只是监听这一行为,并做出相应的处理。
session超时,是会删除该session对象,此session中的数据全部丢失;
session钝化是将此session暂存到硬盘,需要时加载到内存接着用,数据依然在。
某个jsp中,先request.getSession()获取session,然后使用Session中的数据。我一直停留在这个jsp页面,算不算一直在使用这个session?
不算。jsp和php一样,是在服务器端解析的。tomcat解析jsp(此时使用session),然后以html文档的形式返回给浏览器,浏览器显示的是html文档,html是静态资源,和session没有半毛钱关系。
session钝化对高并发项目很有用。
比如双11、双12,大家都先打开购物车,不做其他操作,坐等时间一到就购买。
服务器内存中有大量的Session对象,但很多session在几分钟内都是闲置的。通过session钝化将这些闲置的session暂存到硬盘,减轻服务器负担,等到需要时会自动活化。
原文地址: https://www.cnblogs.com/chy18883701161/p/11436983.html
本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
相关文章