SpringBoot 监听器

  • 过滤器和监听器是基于serlvet。
  • 拦截器是基于Spring MVC框架。

监听器:

       监听器也是基于serlvet,主要是监听 以下三个对象:

  1. ServletContextListener:servlet全局对象
  2. HttpSessionListener:session对象
  3. ServletRequestListener:request对象

     主要监听两种情况:

  1. 对象的创建和销毁
  2. 对象内的属性增加,修改,或删除。

实现监听器监听上述三个对象需要实现对应三个接口:

      HttpSessionListener,ServletRequestListener, ServletContextAttributeListener,重写对应方法,代码如下,看方法名字就知道方法是监听什么的:

package com.zxy.loglearn.config.listener;

import lombok.extern.slf4j.Slf4j;

import javax.servlet.ServletContextAttributeEvent;
import javax.servlet.ServletContextAttributeListener;
import javax.servlet.ServletRequestEvent;
import javax.servlet.ServletRequestListener;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;

/**
 * @USER: 95656
 * @DATE: 2019/12/26 14:26
 * ServletContextListener :全局对象 HttpSessionListener:session对象 ServletRequestListener:request对象
 * 监听对象创建销毁
 * ServletContextListener/HttpSessionListener/ServletRequestListener :
 * 监听对象属性变化改变:
 * ServletContextAttributeListener /HttpSessionAttributeListener /ServletRequestAttributeListener
 *
 **/
@Slf4j
public class ListenerConfig implements HttpSessionListener,ServletRequestListener, ServletContextAttributeListener {

    public static long count = 0;

    /**
     * 监听会话创建
     * @param event
     */
    @Override
    public void sessionCreated(HttpSessionEvent event) {
        count++;
        log.info("current online :{},{}", count, event.getSession().getId());
        System.out.println("add seesion:"+count);
        event.getSession().getServletContext().setAttribute("count", count);
    }

    /**
     * 监听会话销毁
     * @param event
     */
    @Override
    public void sessionDestroyed(HttpSessionEvent event) {
        count--;
        log.info("current online :{},{}", count, event.getSession().getId());
        System.out.println("delete session:"+count);
        event.getSession().getServletContext().setAttribute("count", count);
    }

    /**
     * 监听请求创建
     * @param sre
     */
    @Override
    public void requestDestroyed(ServletRequestEvent sre) {
        System.out.println("enter application "+sre.getServletRequest().getServerName());
    }

    /**
     * 监听请求销毁
     * @param sre
     */
    @Override
    public void requestInitialized(ServletRequestEvent sre) {
        System.out.println("leave applicattion :"+sre.getServletRequest().getProtocol());
    }

    /**
     * 监听ServletContext添加属性
     * @param scae
     */
    @Override
    public void attributeAdded(ServletContextAttributeEvent scae) {

        log.info("add global varibal : {}",scae.getServletContext().getAttribute("global"));
    }

    /**
     * 监听ServletContext移除属性
     * @param scae
     */
    @Override
    public void attributeRemoved(ServletContextAttributeEvent scae) {

        log.info("remove global varibal");
    }

    /**
     * 监听ServletContext修改属性
     * @param scae
     */
    @Override
    public void attributeReplaced(ServletContextAttributeEvent scae) {
        log.info("update global varibal : {}",scae.getServletContext().getAttribute("global"));
    }
}

向spring注册监听:

package com.zxy.loglearn.config;

import com.zxy.loglearn.config.filter.FilterConfigure;
import com.zxy.loglearn.config.listener.ListenerConfig;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.boot.web.servlet.ServletListenerRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * @USER: zhouxy
 * @DATE: 2019/12/26 14:57
 **/
@Configuration
public class ServletConfigure {
    /**
     * 注册监听bean
     * @return
     */
    @Bean
    public ServletListenerRegistrationBean registerListener() {
        ServletListenerRegistrationBean bean = new ServletListenerRegistrationBean();
        bean.setListener(new ListenerConfig());
        return bean;
    }

    /**
     * 向spring注册过滤器
     * @return
     */
    @Bean
    public FilterRegistrationBean<FilterConfigure> filterRegistrationBean1() {
        FilterRegistrationBean<FilterConfigure> filterRegistrationBean = new FilterRegistrationBean<>();
        filterRegistrationBean.setFilter(new FilterConfigure());
        filterRegistrationBean.addUrlPatterns("/*");
        filterRegistrationBean.setOrder(1);//多个filter的时候order的数值越小 则优先级越高
        return filterRegistrationBean;
    }
}

       

应用:

     统计在线人数,测试例子

package com.zxy.loglearn.controller;

import com.zxy.loglearn.config.listener.ListenerConfig;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

import javax.servlet.ServletContext;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;

@Api(value = "测试项目",tags = "测试项目")
@RestController
@RequestMapping("/test")
@Slf4j
public class TestController {

    @ApiOperation(value = "测试监听HttpSessionListener",notes = "测试监听HttpSessionListener")
    @GetMapping("/sessionListener")
    public String test(HttpServletRequest request, @RequestParam String id){
        HttpSession session = request.getSession();
        if(id.equals("1")){
            session.setAttribute("zhou","zhou");
            ServletContext servletContext = request.getServletContext();
            servletContext.setAttribute("global","全局变量");
        }
        if(id.equals("2")){
            session.setAttribute("xiao","xiao");
            ServletContext servletContext = request.getServletContext();
            servletContext.removeAttribute("global");
        }
        if(id.equals("3")){
            session.setAttribute("yu","yu");
            ServletContext servletContext = request.getServletContext();
            servletContext.setAttribute("global","全局变量2");
        }
        log.info("current online : {}", ListenerConfig.count);
        return "listener  seesion  change";
    }
}
发布了38 篇原创文章 · 获赞 1 · 访问量 1044

猜你喜欢

转载自blog.csdn.net/yu13843271857/article/details/103754378