首页 > 其他分享 >Spring Boot中的过滤器、拦截器、监听器技巧汇总:让你快速成为大神

Spring Boot中的过滤器、拦截器、监听器技巧汇总:让你快速成为大神

时间:2023-10-21 12:32:06浏览次数:39  
标签:拦截器 请求 Spring 应用程序 响应 监听器 过滤器

环境说明:Windows10 + Idea2021.3.2 + Jdk1.8 + SpringBoot 2.3.1.RELEASE

前言

在Web应用程序中,我们经常需要处理请求和响应。有时,我们需要应用于所有请求和响应的通用逻辑。这就是过滤器、拦截器和监听器的用武之地。它们可以帮助我们在请求和响应被处理之前或之后执行一些通用逻辑。

摘要

本文将介绍在Spring Boot应用程序中使用过滤器、拦截器和监听器的技巧。我们将讨论它们之间的区别,以及何时使用它们。我们还将提供代码示例,以帮助您在自己的应用程序中使用它们。

正文

过滤器

过滤器是在请求进入Servlet容器之前或响应离开容器之后执行的,用于在处理请求或响应之前/之后修改它们。 在Spring Boot中,我们可以使用Filter接口实现一个过滤器。以下是一个示例:

@Component
public class MyFilter implements Filter {

    @Override
    public void doFilter(
      ServletRequest request, 
      ServletResponse response, 
      FilterChain chain) throws IOException, ServletException {
 
        HttpServletRequest req = (HttpServletRequest) request;
        HttpServletResponse res = (HttpServletResponse) response;
 
        // 执行一些通用逻辑
        System.out.println(
          "Logging Request  {} : {}" + req.getMethod() + " " + 
          req.getRequestURI());
 
        // 继续处理请求
        chain.doFilter(request, response);
 
        // 执行一些通用逻辑
        System.out.println(
          "Logging Response :{}" + 
          res.getContentType());
    }
 
    // 省略掉其他方法
}

在上面的示例中,我们定义了一个名为MyFilter的过滤器。它将在请求进入Servlet容器之前和离开容器之后执行。我们可以在此处执行一些通用逻辑,如记录请求/响应、修改请求/响应等。

为了将此过滤器应用于我们的应用程序,我们需要将其注册到Spring Boot应用程序中。我们可以使用@ServletComponentScan注释自动扫描我们的过滤器。例如:

@SpringBootApplication
@ServletComponentScan
public class MyApp {
 
    public static void main(String[] args) {
        SpringApplication.run(MyApp.class, args);
    }
}

拦截器

拦截器与过滤器类似,但它们提供更灵活的方式来处理请求和响应。拦截器只能与Spring MVC一起使用,它们允许我们在控制器处理请求之前或之后执行逻辑。 拦截器可以为包含控制器的所有请求执行通用逻辑,同时还可以为每个控制器或每个请求执行特定逻辑。

在Spring Boot中,我们可以使用HandlerInterceptor接口实现一个拦截器。以下是一个示例:

@Component
public class MyInterceptor implements HandlerInterceptor {
 
    @Override
    public boolean preHandle(
      HttpServletRequest request, 
      HttpServletResponse response, 
      Object handler) throws Exception {
 
        // 执行一些通用逻辑
        System.out.println(
          "Logging Request  {} : {}" + 
          request.getMethod() + " " + request.getRequestURI());
 
        return true;
    }
 
    // 省略掉其他方法
}

在上面的示例中,我们定义了一个名为MyInterceptor的拦截器。它将在控制器处理请求之前执行。我们可以在此处执行一些通用逻辑,如记录请求、验证请求参数等。

为了将此拦截器应用于我们的应用程序,我们需要将其注册到Spring Boot应用程序中。我们可以使用WebMvcConfigurer接口来注册拦截器。例如:

@Configuration
public class AppConfig implements WebMvcConfigurer {
 
    @Autowired
    private MyInterceptor myInterceptor;
 
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(myInterceptor);
    }
}

在上面的示例中,我们将MyInterceptor添加到拦截器注册表中。

监听器

监听器是在Spring应用程序中处理事件的通用机制。 Spring Boot应用程序中的事件可以是Web请求、应用程序启动/停止等。 监听器可以监听这些事件,并在事件发生时执行一些逻辑。

在Spring Boot中,我们可以使用ApplicationListener接口实现一个监听器。以下是一个示例:

@Component
public class MyAppListener 
  implements ApplicationListener<ApplicationEvent> {
 
    @Override
    public void onApplicationEvent(ApplicationEvent event) {
 
        // 处理事件
        System.out.println("Event: " + event.getClass());
    }
}

在上面的示例中,我们定义了一个名为MyAppListener的监听器。它将在应用程序中的任何事件发生时执行。我们可以在此处执行一些逻辑,如记录事件、修改应用程序状态等。

为了将此监听器应用于我们的应用程序,我们需要将其注册到Spring Boot应用程序中。我们可以使用@Component注释将其定义为组件。

代码方法介绍

过滤器

在上面的示例中,我们实现了一个名为MyFilter的过滤器。以下是一些在过滤器中使用的常见方法:

  • doFilter:执行过滤器逻辑。可以在此处修改请求和响应。
  • init:初始化过滤器。在过滤器实例化时调用。
  • destroy:销毁过滤器。在过滤器销毁时调用。

拦截器

在上面的示例中,我们实现了一个名为MyInterceptor的拦截器。以下是一些在拦截器中使用的常见方法:

  • preHandle:在控制器处理请求之前执行。可以在此处验证请求、记录请求等。
  • postHandle:在控制器处理请求之后执行,但在响应发送到客户端之前。可以在此处修改响应、记录响应等。
  • afterCompletion:在响应发送到客户端之后执行。可以在此处记录响应等。

监听器

在上面的示例中,我们实现了一个名为MyAppListener的监听器。以下是一些在监听器中使用的常见方法:

  • onApplicationEvent:处理事件。可以在此处记录事件、修改应用程序状态等。

优缺点

过滤器(Filter):

优点:

  1. 可以拦截请求和响应,且处理请求和响应方便;
  2. 可以对请求进行预处理和后处理,如字符编码转换、session管理等;
  3. 可以实现对特定URL或者路径进行特定的处理和拦截;
  4. 可以与Servlet容器无缝结合,使用方便。

缺点:

  1. 无法获取Servlet容器的上下文信息;
  2. 无法操作HttpServletRequest和HttpServletResponse对象,只能读取其中的信息和设置信息;
  3. 过滤器只能拦截Servlet请求,不能拦截其他的请求;
  4. 过滤器只能对请求进行处理,无法对响应进行处理;
  5. 过滤器执行顺序不能保证。

拦截器(Interceptor):

优点:

  1. 可以拦截请求和响应,且处理请求和响应方便;
  2. 可以获取Servlet容器的上下文信息;
  3. 可以操作HttpServletRequest和HttpServletResponse对象;
  4. 可以对请求进行预处理和后处理;
  5. 可以实现对特定URL或者路径进行特定的处理和拦截;
  6. 可以对Controller方法进行权限控制。

缺点:

  1. 对于Servlet容器没有直接的支持,需要进行额外的配置;
  2. 拦截器只能在Spring MVC中使用。

监听器(Listener):

优点:

  1. 可以监听Servlet容器的生命周期事件,如初始化、销毁等;
  2. 可以监听HttpServletRequest和HttpServletResponse对象的创建和销毁;
  3. 可以实现对ServletContext、HttpSession和ServletRequest等对象的监听。

缺点:

  1. 只能对事件进行监听,无法对请求进行处理;
  2. 监听器执行顺序不能保证;
  3. 监听器只对WEB应用程序有效。

三者对比

过滤器、拦截器和监听器都是用于对应用程序进行特定处理的工具,但它们具有不同的工作方式和用途。

  1. 过滤器(Filter) 过滤器是Servlet规范中的一种组件,用于拦截Web应用程序的请求和响应,可以对请求进行预处理,也可以在响应被发送到客户端之前对其进行后处理。过滤器通常用于实现安全性、日志记录、压缩、字符编码转换等功能。其优点是可以在Web容器的级别上对请求进行统一处理,缺点是只能在Servlet规范的范围内使用。

  2. 拦截器(Interceptor) 拦截器是Spring MVC框架中的一种组件,用于拦截和处理请求和响应。与过滤器不同,拦截器可以在请求被处理前和被处理后执行一些其它的逻辑,比如安全性、日志记录、性能监测、事务管理等。拦截器可以在Spring MVC框架的任意层级上使用,其优点是灵活性高,缺点是需要在代码中显式引用。

  3. 监听器(Listener) 监听器是Java Servlet规范中的一种组件,用于监听Web应用程序的事件,比如ServletContext、HttpSession和ServletRequest等事件。它可以在应用程序运行时动态地捕获这些事件,并执行一些相应的逻辑。其优点是能够监听应用程序的各种事件并根据需要进行相应的处理,缺点是只能监听一些特定的事件。

综上所述,过滤器、拦截器和监听器都有其各自的适用场合和优缺点。过滤器适用于对请求和响应进行统一处理的场合;拦截器适用于在请求被处理前后执行一些其它的逻辑的场合;监听器适用于对应用程序的事件进行监听和处理的场合。

附录源码

  如上涉及所有源码均已上传同步在「GitHub」,提供给同学们一对一参考学习,辅助你更迅速的掌握。

总结

在Web应用程序开发中,过滤器、拦截器和监听器都是常用的工具,用于在处理请求和响应之前或之后执行特定的逻辑。过滤器可以在请求进入Servlet容器之前或响应离开容器之后执行,拦截器只能与Spring MVC一起使用,在控制器处理请求之前或之后执行逻辑,监听器可以在应用程序中处理事件。三种工具各有优缺点,使用场景也不一样。根据需求选择适合的工具可以提高开发效率和应用程序质量。

标签:拦截器,请求,Spring,应用程序,响应,监听器,过滤器
From: https://blog.51cto.com/u_15700751/7966147

相关文章

  • java项目实践-jsp-finter-监听器-day19
    目录1.jsp2.过滤器3.listener监听器1.jspservle逻辑处理方便html页面表现麻烦jsp页面表现方便但是逻辑处理麻烦JSP是一种页面技术JSP本质上是servlet类通过JSP引擎翻译成servletjsp约等于java+html注意:jsp不是访问静态的html文件index.jsp修改成如下代码:<%-......
  • springboot 配置文件元数据
    springboot配置文件元数据1.spring-configuration-metadata.json{"groups":[{"name":"management.appoptics.metrics.export","type":"org.springframework.boot.actuate.autoconfigure.metrics.export.app......
  • 使用Spring Integration接收TCP与UDP请求
    1.简介SpringIntegration是一个开源的项目,它是Spring生态系统的一部分,旨在简化企业集成(EnterpriseIntegration)的开发。它提供了一种构建消息驱动的、松散耦合的、可扩展的企业应用集成解决方案的方式。SpringIntegration基于SpringFramework构建,使开发者能够更容易地......
  • SpringBoot中启用虚拟线程
    1.什么是虚拟线程虚拟线程是JDK21版本正式发布的一个新特性。虚拟线程和平台线程主要区别在于,虚拟线程在运行周期内不依赖操作系统线程:它们与硬件脱钩,因此被称为“虚拟”。这种解耦是由JVM提供的抽象层赋予的。虚拟线程的运行成本远低于平台线程。它们消耗的内存要少得多。这就......
  • 基于Vue.js和Spring Boot的口罩自助售卖系统:设计、实现与技术深度解析
    本文介绍了一种基于Vue.js和SpringBoot的口罩自助售卖系统的设计与实现。该系统通过前端Vue.js框架和后端SpringBoot框架的结合,实现了用户注册登录、口罩浏览购买、订单管理等功能。通过详细的代码示例和技术深度的解析,读者能够全面了解系统的设计思路和实现方法。1.引言随着全......
  • SpringBoot Vue3打造企业级一体化SaaS系统[最新版完结]
    点击下载:SpringBoot+Vue3打造企业级一体化SaaS系统     提取码:3ixbSpringBoot和Vue3是目前十分盛行的JavaWeb开发技术栈。SpringBoot能够快速构建Web应用程序,并提供许多有用的功用,如自动配置、快速开发、高效性能、易于部署等。Vue3是一种盛行的前端框架,它能够协助开发......
  • SpringCloudAlibaba Seata在Openfeign跨节点环境出现全局事务Xid失效原因底层探究
    原创/朱季谦曾经在SpringCloudAlibaba的Seata分布式事务搭建过程中,跨节点通过openfeign调用不同服务时,发现全局事务XID在当前节点也就是TM处,是正常能通过RootContext.getXID()获取到分布式全局事务XID的,但在下游节点就出现获取为NULL的情况,导致全局事务失效,出现异常时无法正常回......
  • springdatajpa编写入门接口
    SDJ的一个牛逼的地方就是,它可以只编写JPA规范的接口,然后可以不用写实现类,然后,只要写了这个dao层接口,就可以实现最基本的CRUD操作,然而,要怎么实现JPA规范呢 写这个所谓的JPA规范接口,就是继承JpaRepository和JpaSpecificationExecutor两个接口说说第一个JR,就是它要放一个泛型,然......
  • springdatajpa和Jpa规范和hibiernate的联系
    通过编写Java代码去调用springdatajpa规范,然后SDJ里面封装了JPA规范,jpa规范都是些抽象类和接口,因此它也不干活,把活儿都交还给可以实现JPA规范的hibiernate,hibernate则用于与mysql数据库产生连接,所以hibernate也封装了jdbc操作,可以用来操作数据库,实现orm思想......
  • SpringMVC自定义处理返回值demo和异步处理模式DeferredResult demo
    搭建自定义返回值处理器demo新建springboot项目修改pom.xml<!--新增依赖--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><gro......