JavaWeb---session活化与钝化

Posted 夏小弥

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JavaWeb---session活化与钝化相关的知识,希望对你有一定的参考价值。

会话的持久化:

本篇解决一个问题,就是当正在浏览页面的时候服务器突然关闭,浏览器不关闭,当再次开启服务器时还能够恢复关闭时的页面

HttpSessionActivationListener 
实现此接口的JavaBean,可以感知自己被活化(从硬盘到内存)和钝化(从内存到硬盘)的过程。
如果需要同时保存Session中的JavaBean则JavaBean也要实现Serializable序列化接口。
实现此接口的JavaBean与HttpSessionBindingListener一样,不必配置到web.xml中。
要实现此功能,必须要先配置以下信息:

第一步:书写一个JavaBean,并实现HttpSessionActivationListener接口如下:


第二步:JSP页面,判断是否存在Person,如果没有将Person放到Session中:


第三步:配置Tomcat的Server.xml文件或是将配置好的xml发布文件放到CATALIINA_HOME\\conf\\Catalina\\localhost目录下:

配置文件如下:
directory=“d:/a”是指Session文件保存的目录。


第四步:测试

1:多次开启新的浏览器窗口,并记录SESSIONID。
2:使用shutdown.bat关闭tomcat应用。
3:观察指定的目录下是否存在*.session文件。
4:再次重新启动tomcat,并使用http://localhost:8080/project;jsessionid=xxxxx指定sessionid的方式访问服务器(如果浏览器没关闭的话就不用带上jsessionid)。
5:观察是否为关闭tomcat之前的同一个Session。
6:一般情况下,PersistentManager持久化Session与Cookie共同使用。
7:HttpSessionActivationListener只做为监听类,监听自己是否钝化或是活化。


示例代码如下:

Person.java

package cn.hncu.domain;

import java.io.Serializable;

import javax.servlet.http.HttpSessionActivationListener;
import javax.servlet.http.HttpSessionEvent;

public class Person implements Serializable, HttpSessionActivationListener 
	private String name;
	
	public Person(String name) 
		this.name = name;
	

	@Override
	public void sessionDidActivate(HttpSessionEvent arg0) 
		System.out.println(this+"从硬盘读取并活化了");
	
	
	@Override
	public void sessionWillPassivate(HttpSessionEvent arg0) 
		System.out.println(this+"保存到硬盘");
	

	@Override
	public String toString() 
		return "Person [name=" + name + "]---"+super.toString();
	

index.jsp

<%@page import="java.text.SimpleDateFormat"%>
<%@ page language="java" import="java.util.*,cn.hncu.domain.Person" pageEncoding="UTF-8"%>

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
  </head>
  
  <body>
    <h2>演示session钝化与活化技术</h2>
    <%
    	if (session.getAttribute("p")==null)
    		Person p=new Person(""+new Random().nextInt(100));
    		session.setAttribute("p", p);
    	
    	System.out.println(session.getId()+"---"+session.getAttribute("p"));
    	SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
    	Date d=new Date(session.getCreationTime());
    	System.out.println(sdf.format(d));
    %>
  </body>
</html>


配置xml文件:aa.xml
<Context path="/sessionActivationWeb"    docBase="D:/Workspaces/MyEclipseBlue2014/sessionActivationWeb/WebRoot">
<Manager className="org.apache.catalina.session.PersistentManager"
  saveOnRestart="true">
  <Store className="org.apache.catalina.session.FileStore"
         directory="d:/a"> </Store>
</Manager>
</Context>


然后关于浏览器访问,这里要说一下;就是在浏览器上的http://localhost:8080/的后面要加上的不是项目名,而是上面配置的xml文件的名字,我这里这个文件名是叫aa.xml,因此在访问的时候我输的是http://localhost:8080/aa,因此你可以将这个xml文件的文件名改为你的项目名。


第一次启动时输出信息如下:

此时关闭服务器:

d盘a目录下生成如下文件:


此时在其启动服务器,然后刷新浏览器(若浏览器已经关闭,访问时请带上上次访问的jsessionid):

输出信息如下:

对比一下第一次访问时的信息,发现完全一样的



以上是关于JavaWeb---session活化与钝化的主要内容,如果未能解决你的问题,请参考以下文章

JavaWeb Listener之HttpSessionActivationListener ,session钝化活化

Session的活化和钝化,表单重复提交,验证码使用流程

JavaWeb-其他Listener监听器

Java监听器Listener

HttpSessionActivationListener接口 学习笔记

20Listener和Filter