zoukankan      html  css  js  c++  java
  • HttpSessionActivationListener序列化与反序列化

    一、序列化与反序列化

      1.什么是序列化

        • 把对象转化位字节序列的过程称为序列化(保存到硬盘,持久化)
        • 把字节序列转化位对象的过程称为反序列化(存放于内存)

       2.序列化的用途

        • 把对象的字节序列永久保存到硬盘上,通常放到一个文件中。
        • 把网络传输的对象通过字节序列化,方便传输

        最常见的是Web服务器中的Session对象,当有10万用户并发访问,就有可能出现10万个Session对象,内存可能吃不消,于是Web容器就会把一些seesion先序列化到硬盘中,等要用了,再把保存在硬盘中的对象还原到内存中。

    二、HttpSessionActivationListener监听session对象的序列化与反序列化

      1.HttpSessionActivationListener用于监控实现类本身,当实现类对象被添加到session中(session.setAttribute())后,session对象序列化(钝化)前和反序列化(活化)后都会被执行,相应的方法。  
        • sessionWillPassivate(HttpSessionEvent se)  session钝化前执行(session从内存到硬盘)
        • sessionDidActivate(HttpSessionEvent se)  session活化后执行(session从硬盘到内存)
      2.我们通过在META-INF目录下配置context.xml文件,设置失效时间和session序列化的保存路径,配置如下:
    1 <Context>
    2   <Manager className="org.apache.catalina.session.PersistentManager" maxIdleSwap="1">
    3     <Store className="org.apache.catalina.session.FileStore" directory="d:/session"/>
    4   </Manager>
    5 </Context>
        •  maxIdlSwap="1"表示失效时间为1分钟
        • directory="d:/session"是session保存路径
      工程目录结构:  
      
      3.然后定义一个类实现HttpSessionActivationListener接口,监听session的序列化,代码如下:
     1 public class HttpSessionActivation_Listener implements HttpSessionActivationListener,Serializable {
     2 
     3     private static final long serialVersionUID = -8367567842003252055L;
     4     private String name ;
     5 
     6     public void setName(String name) {
     7 
     8         this.name = name;
     9 
    10     }
    11 
    12     public String getName() {
    13         return name;
    14     }
    15 
    16     public HttpSessionActivation_Listener(String name) {
    17         this.name = name;
    18     }
    19   //对象实例化后保存到session中,当session失效要被序列化前执行,(只有保存到session中的对象才会被监听到)
    20     public void sessionWillPassivate(HttpSessionEvent se) {
    21         System.out.println(name + "=>Session被序列化到(钝化)到硬盘中,SessionId是:"+se.getSession().getId());
    22 
    23     }
    24   //当session被反序列化后执行
    25     public void sessionDidActivate(HttpSessionEvent se) {
    26         System.out.println(name + "=>Session被反序列化到(活化)到内存中,SessionId是:"+se.getSession().getId());
    27     }
    28 }

       4.jsp页面实现:

    1 <%
    2     session.setAttribute("sessionBean",new HttpSessionActivation_Listener("小Cai先森"));
    3 %>
      将实现了HttpSessionActivationListener接口的对象实例化后并添加到session中,(只有添加到session中的对象才能监控到session的动态)
      
      启动服务器,运行结果:
      a.对服务器请求一次后不在做任何操作,等待一分钟,等session失效。(sessionWillPassivate(HttpSessionEvent se)监听
      

      b.再次请求,失效了的session被反序列化到内存中,可以继续使用。(sessionDidActivate(HttpSessionEvent se)监听)

      

      序列化文件可以再配置的目录中查看:(这是补充的,所以会和上面的序列id不一样)

      

  • 相关阅读:
    基于Furion的.NET5 WebApi开发框架
    由react的todolist想到的
    react第三节-基础概念梳理
    uniapp引入字体图标与uniapp传入事件对象与自定义参数
    (react+tsx)函数式组件传参问题
    关于git正确clone指定分支
    关于‘react-app-rewried 不是内部或外部命令’的深度解析
    flex下的多行对齐与预处理器中使用nth-child选择器
    webpack(2)--webapck自身的配置
    webpack解析(1)
  • 原文地址:https://www.cnblogs.com/caijh/p/7687514.html
Copyright © 2011-2022 走看看