HttpSessionActivationListener
实现了HttpSessionActivationListener接口的 JavaBean 对象可以感知自己被活化和钝化的事件
当绑定到 HttpSession 对象中的对象将要随 HttpSession 对象被钝化之前,web 服务器调用如下方法sessionWillPassivate(HttpSessionBindingEvent event) 方法
当绑定到 HttpSession 对象中的对象将要随 HttpSession 对象被活化之后,web 服务器调用该对象的 void sessionDidActive(HttpSessionBindingEvent event)方法
-
钝化状态:
就是将Session内存中的对象持久化(序列化)到磁盘 -
活化状态:
就是将磁盘上的对象再次恢复到session内存中
HttpSessionActivationListener API
配置HttpSessionActivationListener
可以通过配置文件指定:
- 多长时间不使用被钝化
- 钝化文件的位置
在META-INF下创建一个context.xml
<?xml version="1.0" encoding="UTF-8"?>
<Context>
<!-- maxIdleSwqp:session中的对象多久不使用就钝化,单位:分钟 -->
<Manager className="org.apache.catalina.session.PersistentManager" maxIdleSwqp="1" >
<!-- directory:钝化文件的位置 -->
<Store className="org.apache.catalina.session.FileStore" directory="file" />
</Manager>
</Context>
示例:
创建User类,实现HttpSessionActivationListener和Serializable接口:
package pers.zhang.domain;
import javax.servlet.http.HttpSessionActivationListener;
import javax.servlet.http.HttpSessionEvent;
import java.io.Serializable;
/**
* @author zhang
* @date 2019/9/20 - 19:14
*/
public class User implements HttpSessionActivationListener, Serializable {
private Integer userId;
private String userName;
public User(Integer id, String name){
this.userId = id;
this.userName = name;
}
public Integer getUserId() {
return userId;
}
public String getUserName() {
return userName;
}
public void setUserId(Integer userId) {
this.userId = userId;
}
public void setUserName(String userName) {
this.userName = userName;
}
//钝化
@Override
public void sessionWillPassivate(HttpSessionEvent httpSessionEvent) {
System.out.println("User被钝化...");
}
//活化
@Override
public void sessionDidActivate(HttpSessionEvent httpSessionEvent) {
System.out.println("User活化...");
}
}
将User存入Session:
package pers.zhang.servlet;
import pers.zhang.domain.User;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
import java.util.Date;
/**
* @author zhang
* @date 2019/9/20 - 19:20
*/
public class SetUserServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//获得Session
HttpSession session = request.getSession();
//将User放到session中
User user = new User(1, "Tom");
session.setAttribute("user", user);
System.out.println("user被放到session中:" + new Date().toString());
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request, response);
}
}
从session中取出User:
package pers.zhang.servlet;
import pers.zhang.domain.User;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
/**
* @author zhang
* @date 2019/9/20 - 19:32
*/
public class GetUserServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//获得session
HttpSession session = request.getSession();
User user = (User) session.getAttribute("user");
System.out.println("user被活化:" + user.getUserId() + "," + user.getUserName());
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request, response);
}
}
启动服务器,并访问SetUserServlet,控制台输出:
user被放到session中:Fri Sep 20 20:13:01 CST 2019
关闭服务器,控制台输出:
User被钝化...
再次启动服务器,访问GetUserServlet,控制台输出:
user被活化:1,Tom