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在浏览器访问页面的时候,才会创建,启动服务器的时候,不会创建。


相关文章
|
10天前
|
前端开发 Java 关系型数据库
JavaWeb开发简介
JavaWeb开发简介
15 0
|
5天前
|
安全 Java 程序员
在Java中,finalization是一种机制,允许对象在被垃圾收集器回收之前执行一些清理操作。
【6月更文挑战第24天】Java中的finalization机制允许对象在被垃圾收集前执行清理,以释放系统资源或处理敏感信息。`finalize()`方法用于定义此类操作,但它不是可靠的资源管理策略,因为调用时机不确定且可能影响性能。尽管可用于清理外部资源或作为保护措施,但应避免依赖finalization,而应优先采用手动资源管理,遵循“创建者负责”原则。
10 1
|
1天前
|
存储 NoSQL Java
Redis系列学习文章分享---第三篇(Redis快速入门之Java客户端--短信登录+session+验证码+拦截器+登录刷新)
Redis系列学习文章分享---第三篇(Redis快速入门之Java客户端--短信登录+session+验证码+拦截器+登录刷新)
3 0
|
2天前
|
设计模式 Java
java实现一个简单的监听器
java实现一个简单的监听器
8 0
|
2天前
|
前端开发 JavaScript 算法
javaweb(四)——过滤器与监听器
javaweb(四)——过滤器与监听器
|
7天前
|
存储 JSON 前端开发
JavaWeb中用来定义统一的响应结果的result类
JavaWeb中用来定义统一的响应结果的result类
11 0
|
8天前
|
安全 前端开发 Java
Java Web项目登录报Session Error
Java Web项目登录报Session Error
14 0
|
8天前
分享JavaWeb中filter过滤器的案例妙用 - 脏话过滤/编码过滤/代码过滤
分享JavaWeb中filter过滤器的案例妙用 - 脏话过滤/编码过滤/代码过滤
10 0
|
10天前
|
Web App开发 JSON Java
JavaWeb基础第五章(请求,响应与分层解耦)
JavaWeb基础第五章(请求,响应与分层解耦)