一、功能描述
自定义实现类,通过实现监听器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在浏览器访问页面的时候,才会创建,启动服务器的时候,不会创建。