• 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);
    		
    	}
    
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52

    (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
    		
    	}
    
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29

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

    
    <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>day02display-name>
      
      <listener>
      	<listener-class>cn.heima.MyServletContextListenerlistener-class>
      listener>
      
      <listener>
      	<listener-class>cn.heima.MySessionListenerlistener-class>
      listener>
    web-app>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    (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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    (5)项目启动后,定时任务会根据设置的间隔时间,进行自动跑起来
    在这里插入图片描述
    (6)因为此时还没有创建session?那什么时候开始创建session呢?
    当通过浏览器访问jsp页面的时候,服务器会自动创建一个session ,即:JSESSIONID
    在这里插入图片描述

    三、总结

    总结一下步骤
    1、创建监听器接口实现类
    2、在web.xml文件中配置,进行注册
    3、使用Timer定时器类,实现定时器功能
    4、ServletContext类在服务启动的时候,会立即创建
    5、HttpSession在浏览器访问页面的时候,才会创建,启动服务器的时候,不会创建。

  • 相关阅读:
    Spring Authorization Server(AS)从 Mysql 中读取客户端、用户
    jboss/CVE-2017-7504
    【TcaplusDB知识库】TcaplusDB-tcapulogmgr工具介绍(二)
    java计算机毕业设计高校图书馆管理网站源码+mysql数据库+系统+lw文档+部署
    Python批量读取HDF多波段栅格数据并绘制像元直方图
    [机器学习入门] 笔记1 卷积神经网络 CNN 的相关概念理解
    如何把Spring学精通了?
    【Hack The Box】linux练习-- Sunday
    上海高考语文命题趋势和备考建议?附1990年-2023年高考语文真题和答案资源
    牛客--密码验证合格程序python
  • 原文地址:https://blog.csdn.net/weixin_43860634/article/details/126823072