session 对象的绑定、解绑和钝化、活化
监听对象与session的绑定与解绑
接口:HttpSessionBindingListener
监听一个类实例何时被添加到session域中,何时移除了session域。
此监听器不用配置web.xml
/*** 监听session属性对象的绑定与解绑* @author 1**/
public class Bean implements HttpSessionBindingListener {private String name;private String pwd;public Bean(String name,String pwd) {this.name = name;this.pwd= pwd;}public String getName() {return name;}public void setName(String name) {this.name = name;}public String getPwd() {return pwd;}public void setPwd(String pwd) {this.pwd = pwd;}@Overridepublic void valueBound(HttpSessionBindingEvent event) {System.out.println("session绑定对象:"+event.getName());}@Overridepublic void valueUnbound(HttpSessionBindingEvent event) {System.out.println("session解绑对象:"+event.getName());}}
当调用session.setAttribute(“name”,bean);时,自动调用valueBound提示对象与session绑定。
当调用session.remove()时自动调用valueUnbound提示对象以与session解绑。
Session 的钝化与活化
场景:服务器宕机,钝化活化保证数据不丢失。
首先要理清楚活化与钝化的本质——就是序列化与反序列化。
钝化:简单来说, 就是将session对象从内存中存到硬盘。
活化:将session对象从硬盘中读取。session获取某一对象时, 先从内存中寻找, 若内存中不存在, 则直接尝试从钝化的文件中寻找。
这样做的好处是当服务器突然宕机,将session的数据保留(钝化),重启之后可以直接使用(活化)。
监听session对象的钝化、活化需要使用到 HttpSessionActivationListener 接口。
钝化
当服务器正常关闭时,还存活着的session(在设置时间内没有销毁) 会随着服务器的关闭被以文件(“SESSIONS.ser”)的形式存储在tomcat 的work 目录下,这个过程叫做Session 的钝化。
活化
当服务器再次正常开启时,服务器会找到之前的“SESSIONS.ser” 文件,从中恢复之前保存起来的Session 对象,这个过程叫做Session的活化。
钝化与活化注意事项
- 想要随着Session 被钝化、活化的对象它的类必须实现Serializable 接口,还有要注意的是只有在服务器正常关闭的条件下,还未超时的Session 才会被钝化成文件。当Session 超时、调用invalidate 方法或者服务器在非正常情况下关闭时,Session 都不会被钝化,因此也就不存在活化。
- 在被钝化成“SESSIONS.ser” 文件时,不会因为超过Session 过期时间而消失,这个文件会一直存在,等到下一次服务器开启时消失。
- 当多个Session 被钝化时,这些被钝化的Session 都被保存在一个文件中,并不会为每个Session 都建立一个文件。
演示 1
第一步
首先我们先创建一个监听器
package Listener;import javax.servlet.http.HttpSessionActivationListener;
import javax.servlet.http.HttpSessionEvent;
import java.io.Serializable;public class ActiveListener implements HttpSessionActivationListener, Serializable {private int num;private String user;public int getNum() {return num;}public void setNum(int num) {this.num = num;}public String getUser() {return user;}public void setUser(String user) {this.user = user;}//监听时刻:即将钝化之前@Overridepublic void sessionWillPassivate(HttpSessionEvent se) {System.out.println("即将钝化之前:ActiveListener对象会随着session的钝化而钝化");}//监听时刻:完成活化之后@Overridepublic void sessionDidActivate(HttpSessionEvent se) {System.out.println("活化后:ActiveListener对象会随着session的活化而活化");}
}
由于钝化活化的本质是序列化与反序列化,所以一定要继承 Serializable 接口
第二步
实现session的钝化和活化并不需要配置 web.xml, 但需要配置一个名为 context.xml 的文件
该文件存放的位置默认是在项目的 tomcat 文件夹中
例如:
/tomcat/项目名/conf/context.xml
找到之后将它打开
并在中加入如下字段:
//maxIdleSwap表示session最大持续多少秒后自动从内存转入硬盘<Manager className="org.apache.catalina.session.PersistentManager" maxIdleSwap="5">
//directory表示存放session文件的路径<Store className="org.apache.catalina.session.FileStore" directory="D:\session"> </Store></Manager>
至于 org.apache.catalina.session.PersistentManager 与 org.apache.catalina.session.FileStore 这里不做过多说明,要详细了解请参考http://blog.sina.com.cn/s/blog_960b18410102v54r.html
这样基本的配置已经完成了
第三步
创建两个简单的JSP
write.jsp:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head><title>Title</title>
</head>
<body>
<%ActiveLister bean=new ActiveLister();bean.setNum(10);bean.setUser("zs");session.setAttribute("bean",bean);
%>
</body>
read.jsp:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head><title>Title</title>
</head>
<body>活化后:num:${sessionScope.bean.num}user:${sessionScope.bean.user}
</body>
一个用于session的写入硬盘,一个用于session从硬盘读取
第四步
接下来就是运行了
首先先运行 write.jsp
虽然在 context.xml 中配置的时间是5s —— maxIdleSwap=“5”
但实际上由于服务器初始化等问题可能等待的时间不止5s
接下来重新打开tomcat服务器, 运行 read.jsp
这样就简单实现了session的钝化与活化。
演示 2
定义两个Servlet ,在一个Servlet 中将“username” 保存在Session 中,另一个Servlet 中获取到该“username”,输出到浏览器。
SessionServlet1
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;@WebServlet("/session1")
public class SessionServlet1 extends HttpServlet {private static final long serialVersionUID = 1L;protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//将username = zhangsan 保存在Session 中request.getSession().setAttribute("username", "zhangsan");}protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {doGet(request, response);}}
SessionServlet12
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;@WebServlet("/session2")
public class SessionServlet2 extends HttpServlet {private static final long serialVersionUID = 1L;protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//获取到username 输出到浏览器String username = (String) request.getSession().getAttribute("username");response.getWriter().write(username);}protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {doGet(request, response);}}
注:由于String 类本身已经实现了序列化接口“java.io.Serializable”,因此会被钝化成文件。如果我们想要自己定义的“POJO”类也可以钝化与活化,那么也必须要实现“java.io.Serializable”接口。这也是为什么我们建议将“POJO”类都实现序列化接口的一个原因。
session 对象的绑定、解绑和钝化、活化相关推荐
- 44session绑定解绑、钝化活化
BeanListener监听绑定或者解绑 HttpSessionActivationListener,Serializable 监听钝化活化 Serializable接口拿来实现获取session里面 ...
- jquery事件绑定解绑机制源码分析
引子 为什么Jquery能实现不传回调函数也能解绑事件?如下: $("p").on("click",function(){alert("The par ...
- uniapp 账号登陆,账号绑定/解绑流程,躺坑
第一次开发uniapp微信小程序,记录一下开发中遇到的流程以及坑 账号登陆 1.uni.login 获取code,在调用接口传入code获取uKey 绑定账号/解绑 1.uni.login获取code ...
- JQuery事件绑定解绑方法小结
常用的方法 绑定:bind().delegate().on() 解绑:unbind().undelegate().off() 此外还有live() 不过JQuery1.9及其以上版本删除了此方法 推荐 ...
- linux 网卡绑定解绑,网卡绑定开机绑定,关机解绑
Linux下实现双网卡负载均衡系统环境:RHEL5根据甘肃兰州实际情况的双网卡绑定方案, 方案思路:开机绑定,关机解绑 一.建立虚拟网络接口ifcfg-bond0文件[root@yangwenjun ...
- uniapp Apple iOS 绑定解绑
绑定 uni.login 拉起Apple的登录授权,获取返回的唯一标识:res.authResult.openid 请求后端服务,保存绑定状态 提示:操作成功 解绑 uni.showModal确认弹框 ...
- 华为云如何绑定/解绑二次验证码/虚拟MFA/谷歌身份验证器?
工具 华为云平台 微信小程序二次验证码 方法 登陆华为云平台,点击账户名,点击"安全设置" 点击"虚拟MFA"中的"立即绑定",进行绑定 无 ...
- 阿里云绑定解绑第三方支付宝,淘宝账号
阿里云上有个一直常用的很早注册的一个账号,后来支付宝登录授权又自动生成了一个账号弄成了两个账号,始终没有找到绑定和解绑支付宝账号的功能,找了人工客服,响应很神速,貌似部分用户的账号在安全设置页面账号名 ...
- python web开发-flask中response,cookies,session对象使用详解
Response响应对象: 当一个web请求被服务器处理完后,会返回用户请求的响应,这时候就要用到响应对象,根据响应给用户的形式不同,响应对象有以下几种处理方式 如果返回的是一个合法的响应对象,它会从 ...
- 微信绑定/解绑设备ticket
在微信绑定和解绑的时候需要一个ticke来进行该过程 可是一直没有获取到ticket 一直都是返回fail 后来发现原来是需要在 原来是需要初始化设备库,才能或得到ticket
最新文章
- Codeforces Round #640 (Div. 4)(ABCDEG题解)
- 分布式内存数据库 Geode
- iphone6 iphone6 plus 放大显示模式高分辨率模式问题
- 大数据如何学习 cda认证_第十届CDA认证考试 LEVEL 1 优秀考生访问录:我是如何备考的?...
- python从入门到精通pdf百度云下载-跟老齐学Python从入门到精通 电子版(pdf格式)...
- 多种分布式文件系统简介
- C语言二维数组的指针写法
- 【python进阶】_正则表达式
- vue8种组件通信方式
- 两个点击事件共用一个方法_工作必技:教你简单方法一个电脑开两个,多个微信!...
- P5725 【深基4.习8】求三角形(python3实现)
- 实例:用户登录(python 版)
- Linux基础——操作系统框架
- Oracle PL/SQL 存储过程
- java 求集合真子集_干货 | 集合与函数概念知识点总结
- 全球十九大主流卫星遥感数据下载平台
- Spring事务和事务传播机制
- js前端实现ios12和ios13+摇一摇功能
- 漂亮女人美丽秘诀------猕猴桃(奇异果)
- 三峡学院计算机调剂,重庆三峡学院2019考研预调剂公告