session绑定与解绑,钝化活化

2024-02-07 02:30

本文主要是介绍session绑定与解绑,钝化活化,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

session对象的四种状态:
1)绑定、解绑
2)与钝化(序列化、持久化)、活化(反序列化)

二者的联系:对象绑定在session中(监听1),session钝化对象随之钝化(监听2)。

下面将介绍这两个过程的监听即:绑定、解绑 与钝化、活化。

session绑定和解绑(无需配置web.xml):

监听象需实现:HttpSessionBingListener接口。
作用:javabean实现HttpSessionBingListener接口后,javabean就知道自己是否添加到了session中,是否被session移除。
1.将对象a[绑定]在session中:session.setAttribute("a",xxx)
2.将对象a从session中[解绑]:session.removceAttribute("a")

测试代码:

public class BeanListener implements HttpSessionBindingListener {@Override//绑定public void valueBound(HttpSessionBindingEvent arg0) {System.out.println("绑定bean对象(将bean对象增加到session域中),bean对象地址:"+this+",sessionId:"+arg0.getSession().getId());}@Override//解绑public void valueUnbound(HttpSessionBindingEvent arg0) {System.out.println("解除bean对象(将bean从session域中移除),bean对象地址:"+this+",sessionId:"+arg0.getSession().getId());	}
}
<body><%BeanListener bean=new BeanListener();session.setAttribute("bean", bean);//绑定session.removeAttribute("bean");//解绑%></body>

运行代码2次结果如下(即访问该.jsp,再刷新一次):

绑定对象(对象增加到session域),bean对象地址:org.threetierarc.listener.BeanListener@165f6d,sessionId:D57825F2BEAAA38E47659C823945A343
解除对象(从session域中移除),bean对象地址:org.threetierarc.listener.BeanListener@165f6d,sessionId:D57825F2BEAAA38E47659C823945A343
绑定对象(对象增加到session域),bean对象地址:org.threetierarc.listener.BeanListener@4af347,sessionId:D57825F2BEAAA38E47659C823945A343
解除对象(从session域中移除),bean对象地址:org.threetierarc.listener.BeanListener@4af347,sessionId:D57825F2BEAAA38E47659C823945A343

结果分析:第一次创建bean1对象,进行session绑定,然后解除,第二次创建新的bean2对象,进行session绑定,然后再解除,因此bean地址不同,而sessionid相同。

 

session钝化与活化(无需配置web.xml)

理解钝化与活化:
钝化(序列化):内存--->硬盘
活化(反序列化):硬盘--->内存

作用:
情况一:服务器内存有限,在很多用户访问服务器时,存在很多session,为了节省资源,将长时间没有活动的用户session信息序列化存入硬盘,当用户再次活动时,再从硬盘中反序列化调回session信息,用户没有察觉。
情况二:在万不得已的情况下重启,那么为了用户体验,必须将session信息保存在硬盘中,当重启后,session在回到内存。
因此总结:保存session到硬盘,需要保留用户的session信息,该用户的信息保存在javabean中,此监听接口就是用来监听该javabean随session一起保存到硬盘了没。

监听session的钝化、活化实现:HttpSessionActivationListener接口,Serializable接口
监听代码:

package org.threetierarc.listener;import javax.servlet.http.HttpSessionActivationListener;
import javax.servlet.http.HttpSessionEvent;public class Bean implements HttpSessionActivationListener,Serializable{private String username;private String password;public Bean(){}public Bean(String username, String password) {super();this.username = username;this.password = password;}public String getUsername() {return username;}public void setUsername(String username) {this.username = username;}public String getPassword() {return password;}public void setPassword(String password) {this.password = password;}//监听时刻:活化之后@Overridepublic void sessionDidActivate(HttpSessionEvent arg0) {// TODO Auto-generated method stubSystem.out.println("Bean即将与session一起:活化");}//监听时刻:钝化之前@Overridepublic void sessionWillPassivate(HttpSessionEvent arg0) {System.out.println("Bean即将与session一起:钝化");}}

特别注意:监听时刻->钝化前与活化后 


完成钝化、活化操作:

配置的方式主要有3种,3选一即可。
(1)在tomcat里面 conf/context.xml 里面配置    (我选的)
特点:对所有的运行在这个服务器的项目生效    
(2)在conf/Catalina/localhost/context.xml 配置    
特点:对 localhost生效。  localhost:8080  
(3)在自己的web工程项目中的 META-INF/context.xml    
特点:只对当前的工程生效。
配置文件:

<!--maxIdleSwap:最大空闲时间,如果超过该时间,将会被钝化FileStore: 通过该类 具体实现 钝化操作directory:相对路径(相对于Tomcat安装目录/work/Catalina/localhost/项目名,或者eclipse的G:\eclipse\.metadata\.plugins\org.eclipse.wst.server.core\tmp1\work\Catalina\localhost)也可以写绝对路径。  
--><!-- session对象5秒没有访问就钝化 --><Manager className="org.apache.catalina.session.PersistentManager" maxIdleSwap="5"><Store className="org.apache.catalina.session.FileStore" directory="lq"></Store></Manager>

测试jsp代码:

	<%Bean bean=new Bean("wang","123456");session.setAttribute("bean", bean);%>

控制台输出:

钝化文件:

过程分析:启动项目,运行jsp代码后,不对session进行操作,5秒过后将进行钝化,控制台输出"即将钝化",成功钝化后生成.session文件保存在硬盘中,若关闭服务器,再次启动服务器,将要对原有session进行操作,则现在内存中寻找该session,如果没有则在硬盘中找,如果找到则自动反序列化,即钝化文件会销毁并回到内存!


 

这篇关于session绑定与解绑,钝化活化的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/686269

相关文章

SpringMVC入参绑定特别注意

1.直接在controller中定义一个变量,但是此种传输方式有一个限制就是参数名和请求中的参数名必须保持一致,否则失效。 @RequestMapping("test2")@ResponseBodypublic DBHackResponse<UserInfoVo> test2(String id , String name){UserInfoVo userInfoVo = new UserInf

Maven(插件配置和生命周期的绑定)

1.这篇文章很好,介绍的maven插件的。 2.maven的source插件为例,可以把源代码打成包。 Goals Overview就可以查看该插件下面所有的目标。 这里我们要使用的是source:jar-no-fork。 3.查看source插件的example,然后配置到riil-collect.xml中。  <build>   <plugins>    <pl

react笔记 8-19 事件对象、获取dom元素、双向绑定

1、事件对象event 通过事件的event对象获取它的dom元素 run=(event)=>{event.target.style="background:yellowgreen" //event的父级为他本身event.target.getAttribute("aid") //这样便获取到了它的自定义属性aid}render() {return (<div><h2>{

react笔记 8-17 属性绑定 class绑定 引入图片 循环遍历

1、绑定属性 constructor(){super()this.state={name:"张三",title:'我是一个title'}}render() {return (<div><div>aaaaaaa{this.state.name}<div title={this.state.title}>我是一个title</div></div></div>)} 绑定属性直接使用花括号{}   注

react笔记 8-16 JSX语法 定义数据 数据绑定

1、jsx语法 和vue一样  只能有一个根标签 一行代码写法 return <div>hello world</div> 多行代码返回必须加括号 return (<div><div>hello world</div><div>aaaaaaa</div></div>) 2、定义数据 数据绑定 constructor(){super()this.state={na

微信小程序(一)数据流与数据绑定

一、单向数据流和双向数据流 1、单项数据流:指的是我们先把模板写好,然后把模板和数据(数据可能来自后台)整合到一起形成HTML代码,然后把这段HTML代码插入到文档流里面 优点:数据跟踪方便,流向单一,追寻问题比较方便【主要体现:微信小程序】。 缺点:就是写起来不太方便,如果修改UI界面数据需要维护对应的model对象 2、双向数据流:值和UI是双向绑定的,大家都知道,只要UI里面的值发生

使用http-request 属性替代action绑定上传URL

在 Element UI 的 <el-upload> 组件中,如果你需要为上传的 HTTP 请求添加自定义的请求头(例如,为了通过身份验证或满足服务器端的特定要求),你不能直接在 <el-upload> 组件的属性中设置这些请求头。但是,你可以通过 http-request 属性来自定义上传的行为,包括设置请求头。 http-request 属性允许你完全控制上传的行为,包括如何构建请求、发送请

SIGMOD-24概览Part7: Industry Session (Graph Data Management)

👇BG3: A Cost Effective and I/O Efficient Graph Database in ByteDance 🏛机构:字节 ➡️领域: Information systems → Data management systemsStorage management 📚摘要:介绍了字节新提出的ByteGraph 3.0(BG3)模型,用来处理大规模图结构数据 背景

springMVC 参数绑定的注解

本文介绍了用于参数绑定的相关注解。 绑定:将请求中的字段按照名字匹配的原则填入模型对象。 SpringMVC就跟Struts2一样,通过拦截器进行参数匹配。 代码在 https://github.com/morethink/MySpringMVC URI模板变量 这里指uri template中variable(路径变量),不含queryString部分 @PathVariable

flask-login 生成 cookie,session

flask-login 生成 cookie,session Flask-Login login_user() 显示来自 Set-Cookie 标头的加密 cookie # 模拟一个用户类class User(UserMixin):def __init__(self, id):self.id = id@app.route('/login')def login():# 模拟用户登录过程user