SpringBoot监听器的使用方法

开发 架构
主要监听的三个域对象为:ServletRequest域、HttpSession域 和ServletContext域。本文通过几个简单的例子介绍一下监听器的用法。

前言

监听器(Listener)就是监听对象的创建、销毁等状态的变化以及定义一些事件发生后接下来要进行的动作。主要监听的三个域对象为:ServletRequest域、HttpSession域 和ServletContext域。本文通过几个简单的例子介绍一下监听器的用法。

ServletContextListener监听 Servlet上下文

监听 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 对象被销毁了");
    }
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
    @GetMapping("/getServletContext")
    public String getServletContext(HttpServletRequest request) {
        ServletContext servletContext = request.getServletContext();
        Object name = servletContext.getAttribute("name");
        return String.valueOf(name);
    }
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.

执行效果如下:

HttpSessionListener获取在线用户数量

@Component
public class MyHttpSessionListener implements HttpSessionListener {
    public static Integer count = 0;
    @Override
    public void sessionCreated(HttpSessionEvent event) {
        count++;
        ServletContext application = event.getSession().getServletContext();
        application.setAttribute("UserCount", count);
        System.out.println("有人上线了,现在在线人数为:" + count + "人");
    }
    @Override
    public void sessionDestroyed(HttpSessionEvent event) {
        count--;
        ServletContext application = event.getSession().getServletContext();
        application.setAttribute("UserCount", count);
        System.out.println("有人下线了,现在在线人数为:" + count + "人");
    }
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
@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";
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.

执行 127.0.0.1:8090/login,控制台显示:

执行 127.0.0.1:8090/online,返回。

执行 127.0.0.1:8090/logout,控制台显示。

ServletRequestListener统计网站访问次数

@Component
public class MyServletRequestListener implements ServletRequestListener {
    @Override
    public 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);
    }

    @Override
    public void requestDestroyed(ServletRequestEvent servletRequestEvent){
        System.out.println("当前访问次数:" + servletRequestEvent.getServletContext().getAttribute("count"));
    }
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.

随便执行一个接口请求,控制台打印如下:

再次执行:

自定义监听方式

定义监听事件

ublic 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;
    }
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.

定义监听器

@Component
public class MySpringBootListener implements ApplicationListener<ListenerEvent> {

    @Override
    public void onApplicationEvent(ListenerEvent listenerEvent){
        String eventInfo = listenerEvent.getName();
        System.out.println(eventInfo);
    }
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.

发布事件

@RestController
public class ListenerController {
    @Resource
    private ApplicationContext applicationContext;
    @GetMapping("/listener")
    public String listener() {
        ListenerEvent event =new ListenerEvent(this,"九天银河聊编程");
        applicationContext.publishEvent(event);
        return "";
    }
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.

执行 127.0.0.1:8090/listener,控制台显示。

监听器说明

在目前的Servlet API中提供的web事件监听器接口有以下几个:

ServletContextListener -- 监听servletContext对象的创建以及销毁
    contextInitialized(ServletContextEvent event) -- 创建时执行
    contextDestroyed(ServletContextEvent event) -- 销毁时执行

HttpSessionListener -- 监听session对象的创建以及销毁
    sessionCreated(HttpSessionEvent event) -- 创建时执行
    sessionDestroyed(HttpSessionEvent event) -- 销毁时执行

ServletRequestListener -- 监听request对象的创建以及销毁
    requestInitialized(ServletRequestEvent event) -- 创建时执行
    requestDestroyed(ServletRequestEvent event) -- 销毁时执行

ServletContextAttributeListener -- 监听servletContext对象中属性的改变
    attributeAdded(ServletContextAttributeEvent event) -- 添加属性时执行
    attributeReplaced(ServletContextAttributeEvent event) -- 修改属性时执行
    attributeRemoved(ServletContextAttributeEvent event) -- 删除属性时执行

HttpSessionAttributeListener --监听session对象中属性的改变
    attributeAdded(HttpSessionBindingEvent event) -- 添加属性时执行
    attributeReplaced(HttpSessionBindingEvent event) -- 修改属性时执行
    attributeRemoved(HttpSessionBindingEvent event) -- 删除属性时执行

ServletRequestAttributeListener --监听request对象中属性的改变
    attributeAdded(ServletRequestAttributeEvent event) -- 添加属性时执行
    attributeReplaced(ServletRequestAttributeEvent event) -- 修改属性时执行
    attributeRemoved(ServletRequestAttributeEvent event) -- 删除属性时执行
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.

生命周期

request

指一个URL请求,当发送一个请求时被创建,当一个响应返回时,即被销毁。

session

​ 当一个客户端访问一个WEB应用时创建,标记一个用户与服务器之间的多次请求。session失效有以下几个情况:

  • session 过期,即用户长时间不访问服务器造成过期
  • 用户退出系统,即执行session 的 invalidate 方法,清理session
  • 当前 web 应用被卸载(session 未被持久化)

application

​ 贯穿于当前的 WEB 应用的生命周期,当前 WEB 应用被加载时创建 application 对象,当前 WEB 应用被卸载时销毁 application 对象。

责任编辑:姜华 来源: 今日头条
相关推荐

2010-04-23 18:00:31

2009-07-08 17:39:23

Servlet监听器

2011-03-21 16:21:49

Oracle监听口令监听器

2009-09-27 17:46:22

Hibernate监听

2010-04-22 09:52:28

Oracle监听器

2009-11-18 18:28:27

Oracle监听器

2011-05-16 10:14:11

Hibernate

2010-04-23 10:13:18

Oracle监听

2009-07-06 13:48:53

Servlet监听器

2011-06-01 14:55:24

Android Service 监听器

2010-01-13 09:49:09

注释监听器Listener

2009-01-03 13:37:26

Oracle监听器Oracle服务器Oracle网络配置

2010-11-19 13:48:18

2010-04-22 15:46:58

Oracle监听

2009-11-09 10:03:09

WCF通道监听器

2010-02-22 15:06:31

WCF信道监听器

2012-02-03 13:27:16

2010-08-09 09:47:34

Flex事件机制

2010-04-19 15:38:10

2010-08-09 11:06:01

Flex事件机制
点赞
收藏

51CTO技术栈公众号