监听器、拦截器、过滤器

在这里插入图片描述

过滤器

在这里插入图片描述过滤器一般用于登录权限验证、资源访问权限控制、敏感词汇过滤、字符编码转换等等操作,便于代码重用,不必每个servlet中还要进行相应的操作。
使用过滤器:
如果想要使用过滤器,首先需要实现Filter类,并重写三个需要的方法:

init() :该方法在容器启动初始化过滤器时被调用,它在 Filter 的整个生命周期只会被调用一次。注意:这个方法必须执行成功,否则过滤器会不起作用。
doFilter() :容器中的每一次请求都会调用该方法, FilterChain 用来调用下一个过滤器 Filter。
destroy(): 当容器销毁过滤器实例时调用该方法,一般在方法中销毁或关闭资源,在过滤器 Filter 的整个生命周期也只会被调用一次

注:
FilterChain.doFilter() 方法的作用:
​ 1.执行下一个Filter过滤器(如果有Filter)
​ 2.执行目标资源
在这里插入图片描述

@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
    System.out.println("Filter1前置代码");
    filterChain.doFilter(servletRequest,servletResponse);
    System.out.println("Filter1后置代码");
}

spring boot使用过滤器

 1. 使用spring boot提供的FilterRegistrationBean注册Filter
 2. 使用原生servlet注解定义Filter
	方式一:
		先定义Filterimport javax.servlet.*;
		import java.io.IOException;
		public class MyFilter implements Filter {
		    @Override
		    public void init(FilterConfig filterConfig) throws ServletException {
		    }
		    @Override
		    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
		        // do something 处理request 或response
		        System.out.println("filter1");
		        // 调用filter链中的下一个filter
		        filterChain.doFilter(servletRequest,servletResponse);
		    }
		    @Override
		    public void destroy() {
		    }
		}

		注册自定义Filter
		@Configuration
		public class FilterConfig {
		    @Bean
		    public FilterRegistrationBean registrationBean() {
		        FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean(new MyFilter());
		        filterRegistrationBean.addUrlPatterns("/*");
		        return filterRegistrationBean;
		    }
		}
方式二:
	// 注入spring容器
	@Order(2)  //order定义filter的优先级,值越小优先级越高
	@Component
	// 定义filterName 和过滤的url
	@WebFilter(filterName = "my2Filter" ,urlPatterns = "/*")
	public class My2Filter implements Filter {
	    @Override
	    public void init(FilterConfig filterConfig) throws ServletException {
	    }
	    @Override
	    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
	        System.out.println("filter2");
	    }
	    @Override
	    public void destroy() {
	    }
	}

注:@Order或者接口Ordered的作用是定义Spring IOC容器中Bean的执行顺序的优先级,而不是定义Bean的加载顺序,Bean的加载顺序不受@Order或Ordered接口的影响

拦截器

拦截器它是链式调用,一个应用中可以同时存在多个拦截器Interceptor, 一个请求也可以触发多个拦截器 ,而每个拦截器的调用会依据它的声明顺序依次执行。首先编写一个简单的拦截器处理类,请求的拦截是通过HandlerInterceptor 来实现,看到HandlerInterceptor 接口中也定义了三个方法。

preHandle() :这个方法将在请求处理之前进行调用。注意:如果该方法的返回值为false,将视为当前请求结束,不仅自身的拦截器会失效,还会导致其他的拦截器也不再执行。
postHandle():只有在 preHandle()方法返回值为true 时才会执行。会在Controller 中的方法调用之后,DispatcherServlet 返回渲染视图之前被调用。
afterCompletion():只有在 preHandle()方法返回值为true 时才会执行。在整个请求结束之后, DispatcherServlet 渲染了对应的视图之后执行。

spring boot使用拦截器

自定义拦截器:
public class MyInterceptor implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.out.println("preHandle");
        return true;
    }
    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable ModelAndView modelAndView) throws Exception {
        System.out.println("postHandle");
    }
    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable Exception ex) throws Exception {
        System.out.println("afterCompletion");
    }
}

配置拦截器:
@Configuration
public class InterceptorConfig implements WebMvcConfigurer {
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new MyInterceptor())..addPathPatterns("/**");
    }
}

过滤器、拦截器触发时机:

过滤器和拦截器触发时机不一样,过滤器是在请求进入容器后,但请求进入servlet之前进行预处理的。
在这里插入图片描述
拦截器可以获取IOC容器中的各个bean,而过滤器就不行,因为拦截器是spring提供并管理的,spring的功能可以被拦截器使用,只需依赖servlet api ,不需要依赖spring。
过滤器拦截器运行先后步骤:
在这里插入图片描述
1.过滤器几乎可以对所有进入容器的请求起作用,而拦截器只会对Controller中请求或访问static目录下的资源请求起作用。
2.过滤器的实现基于回调函数。而拦截器(代理模式)的实现基于反射,代理分静态代理和动态代理,动态代理是拦截器的简单实现。
3.拦截器加载的时间点在springcontext之前。

监听器

Web监听器的用途
1.统计在线人数和在线用户
2.系统启动时加载初始化信息
3.统计网站访问量
4.跟Spring结合

Java Web开发中的监听器(listener)就是由application、session、request三个对象创建、销毁或者往其中添加、修改、删除属性时自动执行代码的功能组件,如下所示:

  • ServletContextListener:对Servlet上下文的创建和销毁进行监听。
  • ServletContextAttributeListener:监听Servlet上下文属性的添加、删除和修改。
  • HttpSessionListener:对Session的创建和销毁进行监听。
  • HttpSessionAttributeListener:对Session对象中属性的添加、删除和修改进行监听。
  • HttpSessionBindingListener:监听Http会话中对象的绑定信息。
  • HttpSessionActivationListener:监听器监听Http会话的情况。
  • ServletRequestListener:对请求对象的初始化和销毁进行监听。
  • ServletRequestAttributeListener:对请求对象属性的添加、删除和修改进行监听。
    在这里插入图片描述springBoot整合监听器
    在spring boot中添加Listener有两种方法,代码注册Listener和注解自动注册(Servlet和Filter也是如此)。
1.通过ServletListenerRegistrationBean进行代码注册

在这里插入图片描述在这里插入图片描述2.通过注解@ServletComponentScan进行代码注册
在这里插入图片描述在这里插入图片描述

过滤器、拦截器、监听器对比

在这里插入图片描述主要参考
仅用来个人学习!!!多谢各位大佬

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值