- 过滤器和监听器是基于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";
}
}