javaWeb监听器Listener(三)定时清理session

简介: javaWeb监听器Listener(三)定时清理session

一、功能描述

自定义实现类,通过实现监听器ServletContextListener 和 HttpSessionListener 接口 ,来定时清理session数据

二、代码演示

(1)创建MyServletContextListener 类,实现ServletContextListener监听器接口,用来监听ServletContext的创建和销毁,并使用Timer 类,进行定时任务的控制。

package cn.heima;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Iterator;
import java.util.List;
import java.util.Timer;
import java.util.TimerTask;
import javax.servlet.ServletContext;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.http.HttpSession;
public class MyServletContextListener implements ServletContextListener{
  @Override
  public void contextDestroyed(ServletContextEvent arg0) {
    System.out.println("ServletContext   Destroyed =============>");
  }
  @Override
  public void contextInitialized(ServletContextEvent arg0) {
    System.out.println("ServletContext   Initialized =============>");
    ServletContext context = arg0.getServletContext();
    final List<HttpSession> list = Collections.synchronizedList(new ArrayList<HttpSession>());
    context.setAttribute("session", list);
    Timer t = new Timer();
    t.schedule(new TimerTask() {
      @Override
      public void run() {
        System.out.println("开始扫描");
        for (Iterator iterator = list.iterator(); iterator.hasNext();) {
          HttpSession httpSession = (HttpSession) iterator.next();
          long i = System.currentTimeMillis()-httpSession.getLastAccessedTime();
          if(i >= 5){
            System.out.println("session 移除" + httpSession.getId());
            httpSession.invalidate();
            iterator.remove();
          }
        }
      }
    }, 2000,5000);
  }
}

(2)创建MySessionListener类,实现HttpSessionListener监听器接口,用来监听HttpSession的创建和销毁。

package cn.heima;
import java.util.List;
import javax.servlet.ServletContext;
import javax.servlet.http.HttpSession;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;
public class MySessionListener implements HttpSessionListener{
  @Override
  public void sessionCreated(HttpSessionEvent arg0) {
    HttpSession session = arg0.getSession();
    ServletContext context = session.getServletContext();
    List<HttpSession> list = (List<HttpSession>) context.getAttribute("session");
    list.add(session);
    System.out.println("添加的sessionId 為 :" + session.getId());
  }
  @Override
  public void sessionDestroyed(HttpSessionEvent arg0) {
    // TODO Auto-generated method stub
  }
}

(3)记得在web.xml文件中注册 这两个监听器的实现类,否则监听器接口不会生效的

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">
  <display-name>day02</display-name>
  <listener>
    <listener-class>cn.heima.MyServletContextListener</listener-class>
  </listener>
  <listener>
    <listener-class>cn.heima.MySessionListener</listener-class>
  </listener>
</web-app>

(4)启动项目,此时会发现,ServletContext 会首先被初始化

信息: Starting service Catalina
九月 12, 2022 9:27:52 下午 org.apache.catalina.core.StandardEngine startInternal
信息: Starting Servlet Engine: Apache Tomcat/8.0.53
ServletContext   Initialized =============>
九月 12, 2022 9:27:53 下午 org.apache.coyote.AbstractProtocol start
信息: Starting ProtocolHandler ["http-nio-8080"]
九月 12, 2022 9:27:53 下午 org.apache.coyote.AbstractProtocol start
信息: Starting ProtocolHandler ["ajp-nio-8009"]
九月 12, 2022 9:27:53 下午 org.apache.catalina.startup.Catalina start
信息: Server startup in 1473 ms

(5)项目启动后,定时任务会根据设置的间隔时间,进行自动跑起来

(6)因为此时还没有创建session?那什么时候开始创建session呢?

当通过浏览器访问jsp页面的时候,服务器会自动创建一个session ,即:JSESSIONID

三、总结

总结一下步骤

1、创建监听器接口实现类

2、在web.xml文件中配置,进行注册

3、使用Timer定时器类,实现定时器功能

4、ServletContext类在服务启动的时候,会立即创建

5、HttpSession在浏览器访问页面的时候,才会创建,启动服务器的时候,不会创建。


相关文章
|
26天前
|
Java 调度
Java实现定时启动,且只执行一次,如何实现?
【10月更文挑战第18天】Java实现定时启动,且只执行一次,如何实现?
160 3
|
12天前
|
存储 安全 搜索推荐
理解Session和Cookie:Java Web开发中的用户状态管理
理解Session和Cookie:Java Web开发中的用户状态管理
37 4
|
30天前
|
监控 Java
Java定时扫码一个文件夹下的文件,如何保证文件写入完成后才进行处理?
【10月更文挑战第13天】Java定时扫码一个文件夹下的文件,如何保证文件写入完成后才进行处理?
90 1
|
2月前
|
设计模式 Java 关系型数据库
【Java笔记+踩坑汇总】Java基础+JavaWeb+SSM+SpringBoot+SpringCloud+瑞吉外卖/谷粒商城/学成在线+设计模式+面试题汇总+性能调优/架构设计+源码解析
本文是“Java学习路线”专栏的导航文章,目标是为Java初学者和初中高级工程师提供一套完整的Java学习路线。
410 37
|
1月前
|
前端开发 Java 应用服务中间件
Javaweb学习
【10月更文挑战第1天】Javaweb学习
32 2
|
1月前
|
安全 Java Android开发
JavaWeb解压缩漏洞之ZipSlip与Zip炸弹
JavaWeb解压缩漏洞之ZipSlip与Zip炸弹
48 5
|
1月前
|
分布式计算 Java Hadoop
Hadoop-30 ZooKeeper集群 JavaAPI 客户端 POM Java操作ZK 监听节点 监听数据变化 创建节点 删除节点
Hadoop-30 ZooKeeper集群 JavaAPI 客户端 POM Java操作ZK 监听节点 监听数据变化 创建节点 删除节点
62 1
|
2月前
|
缓存 前端开发 Java
【Java面试题汇总】Spring,SpringBoot,SpringMVC,Mybatis,JavaWeb篇(2023版)
Soring Boot的起步依赖、启动流程、自动装配、常用的注解、Spring MVC的执行流程、对MVC的理解、RestFull风格、为什么service层要写接口、MyBatis的缓存机制、$和#有什么区别、resultType和resultMap区别、cookie和session的区别是什么?session的工作原理
【Java面试题汇总】Spring,SpringBoot,SpringMVC,Mybatis,JavaWeb篇(2023版)
|
2月前
|
安全 Java Android开发
JavaWeb解压缩漏洞之ZipSlip与Zip炸弹
JavaWeb解压缩漏洞之ZipSlip与Zip炸弹
100 2
|
1月前
|
Java C#
Java的监听处理事件--小球移动案例
Java的监听处理事件--小球移动案例
13 0