zoukankan      html  css  js  c++  java
  • 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暂存到硬盘,减轻服务器负担,等到需要时会自动活化。

  • 相关阅读:
    HDU-3336-Count the string(扩展KMP)
    洛谷-P3805-Manacher模板
    洛谷-p5410-扩展KMP模板
    HDU-2594-Simpsons' Hidden Talents(kmp, 扩展kmp)
    POJ-3080-Blue jeans(KMP, 暴力)
    [办公应用]两个单独的列数据快速变为两列匹配关联数据
    [办公应用]如何将单词中的部分字母加下划线
    [办公应用]word 2007:全屏快捷键,让复制图片保持原样大小(office 全屏快捷键)
    [办公自动化]如何让excel图表标签中显示最新值数据
    [计算机故障处理]无法访问网络共享资源
  • 原文地址:https://www.cnblogs.com/chy18883701161/p/11436983.html
Copyright © 2011-2022 走看看