天天看點

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";
    }
}
           

繼續閱讀