监听器(Listener)就是监听对象的创建、销毁等状态的变化以及定义一些事件发生后接下来要进行的动作。主要监听的三个域对象为:ServletRequest域、HttpSession域 和ServletContext域。本文通过几个简单的例子介绍一下监听器的用法。
监听 Servlet 上下文对象可以在系统启动的时候初始化一些数据,方便在使用的时候直接调用。使用ServletContextListener监听 Servlet上下文,监听器实现代码如下:
@Component
public class MyServletContextListener implements ServletContextListener {@Override //在 ServletContext 对象创建之后马上调用,做初始化public void contextInitialized(ServletContextEvent event) {event.getServletContext().setAttribute("name","小马");System.out.println("ServletContext 对象被创建了");}@Override // 在 ServletContext 对象销毁之后调用public void contextDestroyed(ServletContextEvent event) {System.out.println("ServletContext 对象被销毁了");}
}@GetMapping("/getServletContext")public String getServletContext(HttpServletRequest request) {ServletContext servletContext = request.getServletContext();Object name = servletContext.getAttribute("name");return String.valueOf(name);}
获取在线用户数量
使用HttpSessionListener获取在线用户数量,代码如下:
@Component
public class MyHttpSessionListener implements HttpSessionListener {public static Integer count = 0;@Overridepublic void sessionCreated(HttpSessionEvent event) {count++;ServletContext application = event.getSession().getServletContext();application.setAttribute("UserCount", count);System.out.println("有人上线了,现在在线人数为:" + count + "人");}@Overridepublic void sessionDestroyed(HttpSessionEvent event) {count--;ServletContext application = event.getSession().getServletContext();application.setAttribute("UserCount", count);System.out.println("有人下线了,现在在线人数为:" + count + "人");}
}
@GetMapping("/online")
public String getOnlinePersoncount(HttpServletRequest request) {Integer userCount = (Integer) request.getServletContext().getAttribute("UserCount");return (userCount == null ? "0" : userCount + "");
}
@GetMapping("/login")
public String logined(HttpSession session) {//相同的session,如果sessionid一致,只会被监听一次。session.setAttribute("username", "小马");return "success";
}
@GetMapping("/logout")
public String logout(HttpSession session) {session.invalidate();//将session设置为失效return "success";
}
统计网站访问次数
使用ServletRequestListener统计网站访问次数,代码如下:
@Component
public class MyServletRequestListener implements ServletRequestListener {@Overridepublic void requestInitialized(ServletRequestEvent servletRequestEvent) {Object countObject = servletRequestEvent.getServletContext().getAttribute("count");System.out.println("历史访问次数:" + countObject);Integer count = 0;if (countObject != null)count = Integer.valueOf(countObject.toString());count++;servletRequestEvent.getServletContext().setAttribute("count", count);}@Overridepublic void requestDestroyed(ServletRequestEvent servletRequestEvent) {System.out.println("当前访问次数:" + servletRequestEvent.getServletContext().getAttribute("count"));}
}
自定义监听方式
定义监听事件
public class ListenerEvent extends ApplicationEvent {String name = null;public String getName() {return name;}public void setName(String name) {this.name = name;}public ListenerEvent(Object source, String value) {super(source);name = value;}
}
定义监听器
@Component
public class MySpringBootListener implements ApplicationListener<ListenerEvent> {@Overridepublic void onApplicationEvent(ListenerEvent listenerEvent) {String eventInfo = listenerEvent.getName();System.out.println(eventInfo);}
}
发布事件
@RestController
public class ListenerController {@Resourceprivate ApplicationContext applicationContext;@GetMapping("/listener")public String listener() {ListenerEvent event =new ListenerEvent(this,"小马");applicationContext.publishEvent(event);return "";}
}
监听器生命周期
request
指一个URL请求,当发送一个请求时被创建,当一个响应返回时,即被销毁。
session
当一个客户端访问一个WEB应用时创建,标记一个用户与服务器之间的多次请求。session失效有以下几个情况:
1、session 过期,即用户长时间不访问服务器造成过期
2、用户退出系统,即执行session 的 invalidate 方法,清理session
3、当前 web 应用被卸载(session 未被持久化)
application
贯穿于当前的 WEB 应用的生命周期,当前 WEB 应用被加载时创建 application 对象,当前 WEB 应用被卸载时销毁 application 对象。