监听session的四种状态(笔记)
作者:互联网
由于并不是全局监听,而是监听个别,因而不需要配置web.xml
一、session的绑定与解绑
绑定:session.setAttribute("bean",xxx),对象bean【绑定】到session中
解绑:session.removeAttribute("bean",xxx),将bean从session中【解绑】
为了时刻监视bean与域session的关系可以将Bean类改为BeanListener类,如下代码:
package listener;
import javax.servlet.http.HttpSessionBindingEvent;
import javax.servlet.http.HttpSessionBindingListener;
public class BeanListener implements HttpSessionBindingListener{
private int num;
private String user;
public BeanListener() {
this.num = 0;
this.user = " ";
}
public int getNum() {
return this.num;
}
public void setNum(int num) {
this.num = num;
}
public void setUser(String user) {
this.user = user;
}
public String getUser() {
return this.user;
}
@Override
public void valueBound(HttpSessionBindingEvent event) {
// TODO Auto-generated method stub
System.out.println("session绑定BeanListener的对象,绑定对象:"+this+",sessionId:"+event.getSession().getId());
}
@Override
public void valueUnbound(HttpSessionBindingEvent event) {
// TODO Auto-generated method stub
System.out.println("session解绑BeanListener的对象,解绑对象:"+this+",sessionId:"+event.getSession().getId());
}
}
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ page import="listener.BeanListener" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<%
BeanListener bean = new BeanListener();
session.setAttribute("bean", bean);
%>
</body>
</html>
访问页面:
刷新后则变为:
由此可知,同一用户(浏览器)刷新前后sessionId相同。
刷新后,再次new了一个新对象,导致解绑旧的对象。
二、session的钝化与活化
当访问客户太多时,部分客户的session就可以从服务器内存被移入服务器硬盘。
钝化:将session从内存移入硬盘。
活化:将session从硬盘移入内存。
本质为序列化与反序列化。
为了时刻监视bean随域session的钝化活化状态,将Bean类改为BeanListener2类,如下代码:
package listener;
import java.io.Serializable;
import javax.servlet.http.HttpSessionActivationListener;
import javax.servlet.http.HttpSessionEvent;
public class BeanListener2 implements HttpSessionActivationListener,Serializable{
//准备被钝化、活化的数据
private int num;
private String user;
public BeanListener2() {
this.num = 0;
this.user = " ";
}
public int getNum() {
return this.num;
}
public void setNum(int num) {
this.num = num;
}
public void setUser(String user) {
this.user = user;
}
public String getUser() {
return this.user;
}
@Override
public void sessionDidActivate(HttpSessionEvent arg0) {//监听刚刚活化完成后的时刻
// TODO Auto-generated method stub
System.out.println("BeanListener2的对象已经随着session进入活化状态");
}
@Override
public void sessionWillPassivate(HttpSessionEvent arg0) {//监听即将钝化前的时刻
// TODO Auto-generated method stub
System.out.println("BeanListener2的对象即将随着session进入钝化状态");
}
}
注:此处的Serializable ID由于不影响,使用的是其自动添加的
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ page import="listener.BeanListener2" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<%
BeanListener2 bean = new BeanListener2();
session.setAttribute("bean", bean);
%>
</body>
</html>
钝化
为了能够立即展现该效果,需要对tomcat服务器进行设置。
请根据自己的eclipse的托管模式修改对应的tomcat。
以上模式需要修改的为eclipse中的tomcat
以上模式可以通过上一种方式修改,也可以直接修改本地tomcat
本文以本地tomcat修改。
打开该处context.xml
<Manager className="org.apache.catalina.session.PersistentManager" maxIdleSwap="5">
<Store className="org.apache.catalina.session.FileStore" directory="lq"/>
</Manager>
maxIdleSwap是最大空闲时间(秒),超过该时间,session被钝化。
Manager 处为管理,Store处为实际执行。
directory为储存的文件名称,位置在Catalina文件夹下的项目位置
可出现下列:
可在服务器中找到:
活化
由于活化是自动完成的,靠着IO流即可读取,因此使用session中绑定的内容即可。
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
num:${sessionScope.bean.num}
</body>
</html>
标签:钝化,num,void,笔记,public,session,user,监听 来源: https://blog.csdn.net/weixin_46949627/article/details/120084416