监听web项目中的三个域对象
application(servletContext)
session(HttpSession)
request(HttpServletRequest)
监听的内容
1. 三个对象的创建于销毁
2. 三个对象的属性变化(增加属性,修改属性,移除属性)
3. session中javabean的状态(钝化和活化)
注意:
所有的监听器都是接口,都需要程序员去做实现
监听三个对象的创建和销毁
ServletContextListener:
创建:服务器启动时,每个项目都会创建一个ServletContext
销毁: 服务器正常关闭时
作用: 用于项目启动时加载一些配置文件,或者在application中存放一些属性
HttpSessionListener:
创建: 用户第一次请求项目,成功创建会话时
销毁:session超时,session手动销毁,服务器非正常关闭(如果正常关闭,session会钝化到磁盘)
ServletRequestListener:
创建: 用户请求时
销毁: 响应生成时
监听三个对象的属性变化
ServletContextAttributeListener
HttpSessionAttributeListener
session域中,添加,修改,删除属性时触发对应的方法
可以防止一个账号多端登陆
ServletRequesetAttributeListener
实例:
- 监听ServletContext,初始化加上项目的根路径
public class MyServletContextListener implements ServletContextListener {
public void contextDestroyed(ServletContextEvent sce) {
System.out.println("ServletContext销毁完毕...");
}
public void contextInitialized(ServletContextEvent sce) {
System.out.println("ServletContext初始化完毕...");
sce.getServletContext().setAttribute("bp", sce.getServletContext().getContextPath());
}
}
- 监听session值的改变
@WebListener
public class MyHttpSessionAttributeListener implements HttpSessionAttributeListener {
public void attributeAdded(HttpSessionBindingEvent event) {
System.out.println("session中属性被添加");
System.out.println(event.getName() + "::" + event.getValue());
}
public void attributeRemoved(HttpSessionBindingEvent event) {
System.out.println("session中属性被删除");
System.out.println(event.getName() + "::" + event.getValue());
}
public void attributeReplaced(HttpSessionBindingEvent event) {
System.out.println("session中属性被修改");
System.out.println(event.getName() + "::" + event.getValue() + "::" + event.getSession().getAttribute(event.getName()));
}
}
- 防止多端登陆
@WebListener
public class LoginListener implements HttpSessionAttributeListener {
//静态的map集合,key是用户名,value是session
//实现数据共享,不同listener实例可以获取到所有session对象
private static Map<String, HttpSession> sessionMap = new HashMap<>();
public void attributeAdded(HttpSessionBindingEvent event) {
//每个用户实现登陆时,都会创建自己的onlineUser属性
if("onlineUser".equals(event.getNam())) {
User onlineUser = (User)event.getValue();
//判断该用户是否已经在线
if(sessionMap.containsKey(onlineUser.getUsername())) {
//让之前用户的session失效
sessionMap.get(onlineUser.getUsername()).invalidate();
}
//将本次登陆的session存放到map中
sessionMap.put(onlineUser.getUsername, event.getSession());
}
}
public void attributeRemoved(HttpSessionBindingEvent event) {
if("onlineUser".equals(event.getName())){
User onlineUser = (User)event.getValue();
sessionMap.remove(onlineUser.getUsername);
}
}
}