Java_Web_Listener监听器

本文介绍了一种通过监听器实现的定时销毁Session机制,利用ServletContextListener监听应用初始化过程,并设置一个定时器来定期检查并销毁长时间未活动的Session,从而有效管理会话资源。

监听器常用于监听常见对象的创建、销毁、属性变化。应用场景(网站的访问量、当前在线人数)

监听器分类:
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.java
package 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---销毁");
	}
}











评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值