其他分享
首页 > 其他分享> > 监听session的四种状态(笔记)

监听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