1、session钝化、活化
钝化、活化的本质就是序列化和反序列化
当有一个用户访问服务器时,服务器就会为该用户创建一个session,有多少用户,就有多少session,但服务器内存有限,用户达到一定数量时,session就不能全放在内存中了,这时可以把session放在硬盘里,这就是session的钝化(序列化)。反过来,将硬盘中的session放到内存中就是session的活化。
钝化: 内存——>硬盘
活化: 硬盘——>内存
2、session的绑定和解绑
session.setAttribute("userA","aaa"); // 绑定
session.removeAttribute("userA"); // 解绑
3、监听session的绑定和解绑
PS:该监听器不需要配置web.xml
session绑定和解绑的监听器需要实现 HttpSessionBindingListener 接口
实现接口的方法
监听器中的代码
// ps:这里的this表示当前session域中绑定的对象
// 绑定
@Override
public void valueBound(HttpSessionBindingEvent event) {
System.out.println("绑定对象"+this+"\nsession:"+event.getSession());
}
// 解绑
@Override
public void valueUnbound(HttpSessionBindingEvent event) {
System.out.println("解绑对象"+this+"\nsession:"+event.getSession());
}
测试用jsp页面中的代码
<%
sessionBindListener sessionbind = new sessionBindListener();
session.setAttribute("bind", sessionbind); // 绑定
%>
第一次访问:
绑定对象org.hp.listener.sessionBindListener@5fceda44
session:org.apache.catalina.session.StandardSessionFacade@becb63
刷新页面:
绑定对象org.hp.listener.sessionBindListener@76ee93cf
session:org.apache.catalina.session.StandardSessionFacade@becb63
解绑对象org.hp.listener.sessionBindListener@5fceda44
session:org.apache.catalina.session.StandardSessionFacade@becb63
可以看到两次的访问响应结果的不同之处
第一次访问,由于页面在session域中绑定了监听器的对象
所以监听器在控制台打印出来 绑定对象和对应的session域
第二次访问(刷新页面)
同样的原因,首先打印出来的就是session域中绑定了一个新对象,然而却是在和第一次访问时相同的session中
然后,监听器解除了前一次访问时绑定的对象(解绑)
4、session钝化、活化监听器
PS:该监听器不需要配置web.xml
监听session钝化、活化需实现 HttpSessionActivationListener接口
并实现接口的两个方法
钝化活化本质上是序列化和反序列化因此需要同时实现Serializable接口
// 为了更好观察,加入一些信息
private String user;
public String getUser() {
return user;
}
public void setUser(String user) {
this.user = user;
}
// 监听session活化(已经活化之后 did)
@Override
public void sessionDidActivate(HttpSessionEvent se) {
}
// 监听session钝化(钝化之前 will)
@Override
public void sessionWillPassivate(HttpSessionEvent se) {
}
如何把session钝化、活化
配置tomcat安装目录的 /conf/context.xml
或在eclipse中开启托管模式,打开server中的context.xml(建议这么做,因为tomcat只能在项目修改然后同步到本地,而不能在本地修改自动同步到项目)
以下是context.xml具体配置
<!--
通过配置xml实现session钝化、活化
maxIdleSwap:最大空闲时间,超过空闲时间后session将被钝化
saveOnRestart:设定服务器重启时是否保存session信息
directory:session文件保存路径,可填相对/绝对路径
相对路径是相对于:Tomcat 8.5\work\Catalina\localhost\项目名\
-->
<Manager className="org.apache.catalina.session.PersistentManager" saveOnRestart="false" maxIdleSwap="5">
<Store className="org.apache.catalina.session.FileStore" directory="test"/>
</Manager>
以下是大致的配置步骤
打开文件,可以看到文件中大部分都注释
在文件中添加标签 <Manager></Manager>
快捷键ctrl+shift+T文本框输入PersistentManager
打开该类,复制全类名 org.apache.catalina.session.PersistentManager粘贴到manager标签的classname属性中
在Manager标签中添加新标签,<Store className=" org.apache.catalina.session.FileStore" />
该类名通过
最后在store标签中添加directory属性,并填入session文件保存路径
要session钝化,等待空闲时间超过之后,服务器会自动将session文件保存在指定目录
要session活化,内存中的session被清空之后,若要获取之前session中保存的对象,服务器就会自动去保存路径的文件中寻找并读取