首先我们来看
如何实现,每隔一段时间打印当前的时间
package com.timer;
import java.util.Date;
import java.util.Timer;
import java.util.TimerTask;
public class TestTimer {
public static void main(String[] args){
//创建一个计时器对象
Timer t = new Timer();
//调度任务
t.schedule(new TimerTask() {//要执行的任务
@Override
public void run() {
System.out.println(new Date());
}
},2000,1000); //两秒后开始,每隔一秒执行里面的语句
}
}
接下来搞定每隔5秒去掉没有响应的session
利用两个监听器
MyServletContextListener:从用户打开网页时就开始监听session的list
MySessionListener :每当有session被创建,就放进ServletContext的专门存储所有创建了的session 的集合list
MyServletContextListener.java
package com.test;
import javax.servlet.ServletContext;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.http.HttpSession;
import java.util.*;
public class MyServletContextListener implements ServletContextListener {
public void contextInitialized(ServletContextEvent sce) {
//通过事件源对象得到事件源(ServletContext)
ServletContext application = sce.getServletContext();
//创建一个集合用于存储所有session对象
List<HttpSession> list = Collections.synchronizedList(new ArrayList<HttpSession>());
//把集合放到application域中
application.setAttribute("sessions",list);
//创建一个计时器对象
Timer t = new Timer();
t.schedule(new TimerTask() {
@Override
public void run() {
System.out.println("开始扫描了。。。");
for(Iterator iterator = list.iterator();iterator.hasNext();){
HttpSession session = (HttpSession) iterator.next();
long l = System.currentTimeMillis()-session.getLastAccessedTime();
if(l>5000){//如果时间大于5秒,把session销毁
System.out.println("session移除了"+session.getId());
session.invalidate();//把session销毁
iterator.remove();//从集合中移除
}
}
/*for(HttpSession session : list){
long l = System.currentTimeMillis()-session.getLastAccessedTime();
if(l>5000){//如果时间大于5秒,把session销毁
session.invalidate();//把session销毁
list.remove(session);//从集合中移除
}
}*/
}
},2000,5000);//延迟2秒后执行,间隔5秒执行一次
}
public void contextDestroyed(ServletContextEvent sce) {
}
}
MySessionListener.java
package com.test;
import javax.servlet.ServletContext;
import javax.servlet.http.HttpSession;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;
import java.util.List;
public class MySessionListener implements HttpSessionListener {
public void sessionCreated(HttpSessionEvent se) {
HttpSession session = se.getSession();
//得到application对象中的list集合
ServletContext application = session.getServletContext();
//得到session对象,并放入到list集合中
List<HttpSession> list =(List<HttpSession>) application.getAttribute("session");
list.add(session);
System.out.println("添加了session"+session.getId());
}
public void sessionDestroyed(HttpSessionEvent se) {
}
}
当然最后要配置xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0">
<!--<listener>-->
<!--<listener-class>com.listener.MyServletContextListener</listener-class>-->
<!--</listener>-->
<!--<listener>-->
<!--<listener-class>com.attributelistener.MyServletRequestListener</listener-class>-->
<!--</listener>-->
<listener>
<listener-class>com.test.MyServletContextListener</listener-class>
</listener>
<listener>
<listener-class>com.test.MySessionListener</listener-class>
</listener>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
</web-app>