Listener--HttpSessionActivationListener(钝化、活化)API、配置和使用详解

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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值