# 监听器
# 什么是监听器
- 监听器(Listener)是 J2EE Servlet 模块下的组件
- Listener 的作用对 Web 应用对象的行为进行监控
- 通过 Listener 监听自动触发指定的功能代码
# 三种监听对象
- ServletContext 对全局 ServletContext 及其属性进行监听
- HttpSession 对用户会话及其属性操作进行监听
- ServletRequest 对请求及属性操作进行监听
# 过滤器与监听器的区别
- 过滤器(Filter)的职责是对 URL 进行过滤拦截,是主动的执行
- 监听器(Listener)的职责是对 Web 对象进行监听,是被动触发
# 开发监听器
- 实现 XXXListener 接口,不同接口对应不同监听对象
- 实现每个接口中独有的方法,实现触发监听的后续操作
- 在 web.xml 中配置
使监听器生效
// 使用注解则不使用配置,推荐使用配置(因为针对的是全局的监听)
@WebListener
public class FirstListener implements ServletContextListener{
@Override
public void contextInitialized(ServletContextEvent sce) {
System.out.println("ServletContext已初始化");
}
@Override
public void contextDestroyed(ServletContextEvent sce) {
System.out.println("ServletContext已销毁");
}
}
# web.xml
<listener>
<listener-class>com.imooc.listener.FirstListener</listener-class>
</listener>
# 内置对象监听器
# 内置对象监听接口
- ServletContextListener 监听 ServletContext 对象创建、销毁等操作
- HttpSessionListener 监听 HttpSession 对象创建、销毁等操作
- ServletRequestListener 监听 HttpServletRequest 对象创建、销毁等操作
public class WebListener implements ServletContextListener, HttpSessionListener, ServletRequestListener {
@Override
public void contextInitialized(ServletContextEvent sce) {
System.out.println("ServletContext已初始化");
}
@Override
public void contextDestroyed(ServletContextEvent sce) {
System.out.println("ServletContext已销毁");
}
@Override
public void sessionCreated(HttpSessionEvent se) {
HttpSession session = se.getSession();
System.out.println("Session已被创建,SessionId:" + session.getId());
}
@Override
public void sessionDestroyed(HttpSessionEvent se) {
System.out.println("Session已被销毁");
}
@Override
public void requestDestroyed(ServletRequestEvent sre) {
System.out.println("HttpServletRequest已销毁");
}
@Override
public void requestInitialized(ServletRequestEvent sre) {
HttpServletRequest request = (HttpServletRequest)sre.getServletRequest();
System.out.println("HttpServletRequest已创建,URI:" + request.getRequestURI());
}
}
# 属性监听器
# 属性监听接口
- ServletContextAttributeListener 监听全局属性操作(增删改)
- HttpSessionAttributeListener 监听用户会话属性操作
- ServletRequestAttributeListener 监听请求属性操作
public class WebAttributeListener implements ServletContextAttributeListener, HttpSessionAttributeListener, ServletRequestAttributeListener {
@Override
public void attributeAdded(ServletContextAttributeEvent event) {
System.out.println("ServletContext新增属性:" + event.getName() + "->" + event.getValue());
}
@Override
public void attributeRemoved(ServletContextAttributeEvent event) {
}
@Override
public void attributeReplaced(ServletContextAttributeEvent event) {
}
@Override
public void attributeAdded(HttpSessionBindingEvent event) {
System.out.println("Session新增属性:" + event.getName() + "->" + event.getValue());
}
@Override
public void attributeRemoved(HttpSessionBindingEvent event) {
}
@Override
public void attributeReplaced(HttpSessionBindingEvent event) {
}
@Override
public void attributeAdded(ServletRequestAttributeEvent srae) {
System.out.println("Request新增属性:" + srae.getName() + "->" + srae.getValue());
}
@Override
public void attributeRemoved(ServletRequestAttributeEvent srae) {
}
@Override
public void attributeReplaced(ServletRequestAttributeEvent srae) {
}
}
# 监听器的应用场景
- 请求流量分析