session的钝化和活化
就是如果网站的session的个数过多的话,内存就会消耗的太多,为了不使内存消耗的太多,所以就把session序列化
放到硬盘中,如果用户再访问你的时候再从硬盘中反序列化放到内存中,这个过程是session 的钝化和活化
那么怎么控制session的要多长时间才要钝化
<Context>
<Manager className="org.apache.catalina.session.PersistentManager" maxIdleSwap="1">
<Store className="org.apache.catalina.session.FileStore" directory="mysession"/>
</Manager>
</Context>
配置在这个位置就是表示的是对所有的项目生效的
应该配置到单独的项目中,上面的maxIdleSwap="1" 表示的是session到了一分钟以后会钝化
启动服务器
如果是myeclipse 的话,过了一分钟会在mysession 的文件夹下面生成一个session的文件
在这个下面会一个文件生成一session
这就是钝化,即使是活化了以后这个文件也不会消失
再一次访问的时候,session就又加载到内存中了,用户是根本感受不到的
当javabean 实现了这个接口以后,当session序列化的时候,javabean 也就跟着序列化了,当session 活化的时候,javabean 也会跟着一起活化了
HttpSessionActivationListener 讲解 代码
public class User implements HttpSessionActivationListener{
@Override
public void sessionWillPassivate(HttpSessionEvent se) {
//session 从内存到硬盘
System.out.println("啊~我陪session去火星了,地球已经不安全了!");
}
@Override
public void sessionDidActivate(HttpSessionEvent se) {
//session 从硬盘到内存
System.out.println("啊~我和session一起重返地球了!");
}
}
开始演示
等待一分钟会钝化
实际上user 并没有陪着session 钝化到硬盘上,实际上它已经死了
最终的结果是
由于session 觉得地球不安全回火星了,user 对象准备要通往火星的火车,session问他,你有票吗,没有票就不让上,它就死在地球上了
由于user 对象已经死了,所以user 对象已经不能返回值了,所以返回的是null
哪里是火星啊,就是这个地方,由于对象没有实现序列化接口,所以是不能由内存到硬盘上的
有一个问题就是,session 保存的是字符串啊,也没有进行序列化和反序列化啊,为什么它没有死呢,是因为
保存的值实际上是new cn.itcast.User().toString() 实际上保存的是字符串,但是我们发现实际上
字符串已经实现了序列化
所以即使被session保存即使没有被序列化,也能保存下来
但是对象不行,必须要序列化
加上序列化以后演示
再等一分钟
已经钝化了,再等一分钟以后开始活化,再通过浏览器访问,user 又出现了