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暂存到硬盘,减轻服务器负担,等到需要时会自动活化。

 

posted @ 2019-08-30 22:00  chy_18883701161  阅读(721)  评论(0编辑  收藏  举报