- 過濾器和監聽器是基于serlvet。
- 攔截器是基于Spring MVC架構。
監聽器:
監聽器也是基于serlvet,主要是監聽 以下三個對象:
- ServletContextListener:servlet全局對象
- HttpSessionListener:session對象
- ServletRequestListener:request對象
主要監聽兩種情況:
- 對象的建立和銷毀
- 對象内的屬性增加,修改,或删除。
實作監聽器監聽上述三個對象需要實作對應三個接口:
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";
}
}