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

结合javaWeb监听器来定时清理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在浏览器访问页面的时候,才会创建,启动服务器的时候,不会创建。


版权声明:本文为weixin_43860634原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。