Spring Boot 监听器、拦截器以及过滤器的作用、差异?

简介: Spring Boot 监听器、拦截器以及过滤器的作用、差异?

Spring Boot 常用的增强功能之一就是支持监听器、拦截器以及过滤器。这些功能为我们提供了在应用程序运行时对请求和响应进行操作的机制。本文将详细介绍 Spring Boot 监听器、拦截器以及过滤器的作用、差异以及如何使用。

监听器

监听器是一种组件,它可以监听应用程序中发生的各种事件,并在某个事件触发时执行代码。在 Spring Boot 中,我们可以通过实现 ApplicationListener 接口或者使用 @EventListener 注解来编写监听器。常用的事件包括应用程序启动、上下文创建、上下文刷新、上下文关闭等。

下面是一个简单的示例,演示了如何编写一个 Spring Boot 监听器:

@Component
public class MyAppListener implements ApplicationListener<ApplicationEvent> {
   

    @Override
    public void onApplicationEvent(ApplicationEvent event) {
   
        if (event instanceof ContextRefreshedEvent) {
   
            System.out.println("Application context refreshed event received.");
        }
    }
}

上述监听器类实现了 ApplicationListener 接口,并重写了 onApplicationEvent 方法,用以对指定事件进行处理。在本例中,该监听器仅对应用程序上下文刷新事件做出响应,并在该事件触发时打印一条日志。

拦截器

拦截器是一种组件,它可以截获 HTTP 请求和响应,并在请求前后执行一些操作。拦截器通常用于身份验证、日志记录、性能分析等。在 Spring Boot 中,我们可以通过实现 HandlerInterceptor 接口或者继承 HandlerInterceptorAdapter 类来编写拦截器。

下面是一个简单的示例,演示了如何编写一个 Spring Boot 拦截器:

@Component
public class MyInterceptor extends HandlerInterceptorAdapter {
   

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
            throws Exception {
   
        System.out.println("Pre-handle method is called.");
        return true;
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
            ModelAndView modelAndView) throws Exception {
   
        System.out.println("Post-handle method is called.");
    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler,
            Exception ex) throws Exception {
   
        System.out.println("After completion method is called.");
    }
}

上述拦截器类继承了 HandlerInterceptorAdapter 类,并重写了其三个方法:preHandlepostHandleafterCompletion。在本例中,preHandle 方法在请求前被调用,postHandle 方法在请求处理完成后被调用,afterCompletion 方法在视图渲染完成后被调用。

过滤器

过滤器是一种用于对请求和响应实施过滤的组件。它可以拦截 Web 应用程序中的请求,并允许我们在该请求被路由到控制器前或响应被发送到客户端前修改它们。在 Spring Boot 中,我们可以通过实现 Filter 接口来编写过滤器。

下面是一个简单的示例,演示了如何编写一个 Spring Boot 过滤器:

@Component
public class MyFilter implements Filter {
   

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
   
        System.out.println("Filter initialized.");
    }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
            throws IOException, ServletException {
   
        System.out.println("Before the request is processed by the servlet.");
        chain.doFilter(request, response);
        System.out.println("After the response is generated by the servlet.");
    }

    @Override
    public void destroy() {
   
        System.out.println("Filter destroyed.");
    }
}

上述过滤器类实现了 Filter 接口,并重写了其三个方法:initdoFilterdestroy。在本例中,init 方法在过滤器被初始化时被调用,doFilter 方法用于拦截请求,并在请求处理完成后生成响应,destroy 方法在过滤器生命周期结束时被调用。

监听器、拦截器、过滤器的区别

尽管监听器、拦截器和过滤器都可以用于拦截请求和响应,并在请求前后执行一些操作,但它们之间还是存在一些区别。下面是一些重要的差异:

  1. 监听器可用于监听应用程序生命周期事件,而拦截器和过滤器则主要用于拦截请求和响应;
  2. 拦截器和过滤器能够读取请求头、请求体、响应头和响应体,而监听器则不能;
  3. 过滤器是 Java Servlet 的标准规范组件,而监听器和拦截器则是 Spring Boot 的扩展组件。

如何使用

在 Spring Boot 中,我们可以通过注解将监听器、拦截器和过滤器添加到应用程序中。下面是一个简单的示例,演示了如何使用 @WebListener 注解和 FilterRegistrationBean 类来添加监听器和过滤器:

@Configuration
public class MyConfig {
   

    @Bean
    public FilterRegistrationBean<MyFilter> myFilter() {
   
        FilterRegistrationBean<MyFilter> registration = new FilterRegistrationBean<>();
        registration.setFilter(new MyFilter());
        registration.addUrlPatterns("/myfilter/*");
        registration.setOrder(1);
        return registration;
    }

    @WebListener
    public class MyAppListener implements ApplicationListener<ApplicationEvent> {
   

        @Override
        public void onApplicationEvent(ApplicationEvent event) {
   
            if (event instanceof ContextRefreshedEvent) {
   
                System.out.println("Application context refreshed event received.");
            }
        }
    }
}

在上述代码中,我们使用 @WebListener 注解来标记一个内部类,该类实现了 ApplicationListener 接口。此外,我们还使用了 FilterRegistrationBean 类,将自定义的过滤器添加到应用程序上下文中。

总结

本文介绍了 Spring Boot 监听器、拦截器和过滤器的作用、差异以及如何使用。监听器、拦截器和过滤器都是 Spring Boot 提供的强大机制,它们为我们提供了灵活的方式来拦截请求和响应,并进行特定操作。掌握这些功能可以使您的应用程序更加灵活、可维护和高效。

目录
相关文章
|
2月前
|
Java 容器
如何在SpringBoot项目中使用过滤器和拦截器
过滤器和拦截器是日常开发中常用技术,用于对特定请求进行增强处理,如插入自定义代码以实现特定功能。过滤器在请求到达 `servlet` 前执行,而拦截器在请求到达 `servlet` 后执行。`SpringBoot` 中的拦截器依赖于 `SpringBoot` 容器,过滤器则由 `servlet` 提供。通过实现 `Filter` 接口并重写 `doFilter()` 方法可实现过滤器;通过实现 `HandlerInterceptor` 接口并重写相应方法可实现拦截器。两者的主要区别在于执行时机的不同,需根据具体场景选择使用。
179 4
如何在SpringBoot项目中使用过滤器和拦截器
|
3月前
|
SQL Java 测试技术
在Spring boot中 使用JWT和过滤器实现登录认证
在Spring boot中 使用JWT和过滤器实现登录认证
220 0
|
3月前
|
前端开发 JavaScript Java
【实操】SpringBoot监听Iphone15邮件提醒,Selenium+Python自动化抢购脚本
本文介绍了一个结合SpringBoot和Python的实用功能,旨在监控iPhone 15的库存状态并通过邮件提醒用户。系统采用SpringBoot监听苹果官网API,解析JSON数据判断是否有货,并展示最近的库存记录。此外,还能自动触发Selenium+Python脚本实现自动化购买。文中详细介绍了技术栈、接口分析、邮件配置及自动化脚本的设置方法。该项目不仅适用于熟悉后端开发的人员,也适合回顾Layui和Jquery等前端技术。
53 0
【实操】SpringBoot监听Iphone15邮件提醒,Selenium+Python自动化抢购脚本
|
1月前
|
Java API Spring
springboot学习七:Spring Boot2.x 拦截器基础入门&实战项目场景实现
这篇文章是关于Spring Boot 2.x中拦截器的入门教程和实战项目场景实现的详细指南。
25 0
springboot学习七:Spring Boot2.x 拦截器基础入门&实战项目场景实现
|
1月前
|
Java API Spring
springboot学习六:Spring Boot2.x 过滤器基础入门&实战项目场景实现
这篇文章是关于Spring Boot 2.x中过滤器的基础知识和实战项目应用的教程。
23 0
springboot学习六:Spring Boot2.x 过滤器基础入门&实战项目场景实现
|
1月前
|
设计模式 Java Spring
Spring Boot监听器的底层实现原理
Spring Boot监听器的底层实现原理主要基于观察者模式(也称为发布-订阅模式),这是设计模式中用于实现对象之间一对多依赖的一种常见方式。在Spring Boot中,监听器的实现依赖于Spring框架提供的事件监听机制。
26 1
|
2月前
|
Java 开发者 Spring
Spring Cloud Gateway 中,过滤器的分类有哪些?
Spring Cloud Gateway 中,过滤器的分类有哪些?
48 3
|
3月前
|
前端开发 JavaScript Java
Spring Boot中使用拦截器
本节主要介绍了 Spring Boot 中拦截器的使用,从拦截器的创建、配置,到拦截器对静态资源的影响,都做了详细的分析。Spring Boot 2.0 之后拦截器的配置支持两种方式,可以根据实际情况选择不同的配置方式。最后结合实际中的使用,举了两个常用的场景,希望读者能够认真消化,掌握拦截器的使用。
|
3月前
|
安全 搜索推荐 Java
|
3月前
|
前端开发 Java 开发者