自定义实现类,通过实现监听器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文件中注册 这两个监听器的实现类,否则监听器接口不会生效的
<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>
(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在浏览器访问页面的时候,才会创建,启动服务器的时候,不会创建。