监听器常用于监听常见对象的创建、销毁、属性变化。应用场景(网站的访问量、当前在线人数)
监听器分类:
1)、监听域对象的创建与销毁
监听ServletContext创建与销毁 ServletContextListener
监听HttpSession创建与销毁 HttpSessionListener
监听HttpServletRequest创建与销毁 ServletRequestListener
2)、监听域对象的属性变化
监听ServletContext属性变化 ServletContextAttributeListener
监听HttpSession属性变化 HttpSessionAttributeListener
监听HttpServletRequest属性变化 ServletRequestAttributeListener
3)、监听session绑定javaBean HttpSessionBindingListener
监听器的实现
1.创建一个类,实现指定的监听器接口
2.重写接口中的方法
3.在web.xml文件中对监听器进行注册或者使用@WebListener注解
定时销毁session案例
package com.bh.test;
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.annotation.WebListener;
import javax.servlet.http.HttpSession;
/**
* @Description 定时销毁session
* @date 2018-01-30 21:40
*/
@WebListener
public class MyServletContextListener implements ServletContextListener {
@Override
public void contextInitialized(ServletContextEvent servletContextEvent) {
//通过事件源获取事件源对象
ServletContext application = servletContextEvent.getServletContext();
//创建集合用来存储session-----线程安全
List<HttpSession> list = Collections.synchronizedList(new ArrayList<HttpSession>());
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 > 5){ //如果超过5s则移除
System.out.println("移除了"+session.getId());
session.invalidate(); //销毁session
iterator.remove(); //移除session
}
}
}
},2000,5000);
}
@Override
public void contextDestroyed(ServletContextEvent servletContextEvent) {
System.out.println("application---销毁");
}
}
MyHttpSessionListener.javapackage com.bh.test;
import java.util.List;
import javax.servlet.annotation.WebListener;
import javax.servlet.http.HttpSession;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;
@WebListener
public class MyHttpSessionListener implements HttpSessionListener {
@Override
public void sessionCreated(HttpSessionEvent sessionEvent) {
HttpSession session = sessionEvent.getSession();
//获取域对象中的session集合
@SuppressWarnings("unchecked")
List<HttpSession> sessions = (List<HttpSession>) session.getServletContext().getAttribute("sessions");
sessions.add(session);
System.out.println("添加了"+session.getId());
}
@Override
public void sessionDestroyed(HttpSessionEvent sessionEvent) {
System.out.println("session---销毁");
}
}