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

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

时间:2023-10-22 12:02:00浏览次数:47  
标签:拦截器 请求 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/7974951

相关文章

  • SpringBoot中给Tomcat添加过滤器
    SpringBoot中给Tomcat添加过滤器目录SpringBoot中给Tomcat添加过滤器一、引入二、Filter功能概述三、添加过滤器进行实操3.1、注解版3.2、配置版本四、原理探究4.1、解析过程4.2、如何添加到ServletContext中?五、总结一、引入JavaWeb组件Servlet提供了filter过滤功能,其功能是对......
  • SpringBoot——yaml配置文件
    yaml简介YAML是"YAMLAin'taMarkupLanguage"(YAML不是一种标记语言)。在开发的这种语言时,YAML的意思其实是:"YetAnotherMarkupLanguage"(是另一种标记语言)。设计目标,就是方便人类读写层次分明,更适合做配置文件使用.yaml或.yml作为文件后缀基本语法大小写敏感使......
  • 记spring 尽量没有冲突的版本
    之前写demo总是随便找一个spring版本,虽然没有很大的冲突,但还是想找一个尽量没有冲突的官方版本,记录下寻找的过程springboot3.0版本java要求是17,目前我的java版本还是8或者11,所以只考虑springboot2版本期望的springboot版本是2.7.17,目前官网的最新的GA版本从上往下,首先是spri......
  • Github Actions实现Spring Boot自动化部署(第二弹)
    GithubActions实现SpringBoot自动化部署(第二弹)前言​ 今天就来讲述一下如何使用GitHub结合Actions实现SpringBoot程序从提交代码到打包、容器化、部署全过程自动化。首先咱们得现有一个能够在本地运行的SpringBoot程序,并且在Github上拥有一个仓库。一、自动化部署1.1提交......
  • 基于SpringBoot与Vue技术的高校毕设管理平台-计算机毕业设计源码+LW文档
    开发语言:Java框架:springbootJDK版本:JDK1.8服务器:tomcat7数据库:mysql5.7(一定要5.7版本)数据库工具:Navicat11开发软件:eclipse/myeclipse/ideaMaven包:Maven3.3.9浏览器:谷歌浏览器数据库部分表:DROPTABLEIFEXISTSbisheketi;/*!40101SET@saved_cs_client=@@characte......
  • SpringBoot与jdk版本冲突
    问题:SpringBoot项目无法正常启动原因:SpringBoot2.0以上版本最低需要java8支持;SpringBoot3.0以上的版本最低需要java17支持。只需要降低pom文件中springboot版本即可。SpringBoot版本参见于https://spring.io/projects/spring-boot#learn文章参考了https://www.cnblogs.co......
  • 基于Springboot框架的优质衣产品系统-计算机毕业设计源码+LW文档
    开发语言:Java框架:springbootJDK版本:JDK1.8服务器:tomcat7数据库:mysql5.7(一定要5.7版本)数据库工具:Navicat11开发软件:eclipse/myeclipse/ideaMaven包:Maven3.3.9浏览器:谷歌浏览器前台用户模块涵盖了:用户登录、注册功能,包括消费者进行优质衣产品系统的登录可进行衣产品的选购等......
  • 基于SpringBoot框架的教学评价系统的设计与实现-计算机毕业设计源码+LW文档
    摘要随着时代的发展,我国的教育水平在不断的提高,但是很多时候为了更好的提高教学的质量,会让学生对当前的教学进行评价,教育工作者根据学生的评价发现当下教学中的一些不足,从而更好的提高教学质量,为了让教学评价变的更加的方便我们开发了本次的教学评价系统。本系统从用户的角度出......
  • 基于springboot洗衣店管理系统-计算机毕业设计源码+LW文档
    摘要随着时代的发展,人们的工作也学习压力越来越大,很多时候空闲时间也越来也少,经常没有时间去洗自己的衣服,很多商家在看到这种情况之后开设了洗衣机店专门用于服务这些没有时间洗衣服的人,但是传统的洗衣店都是用手动的的模式在管理,这种模式很落后,为了改善这一情况很多地方开设了线......
  • springboot使用form标签在两个html页面之间实现界面跳转,出现405问题,但是一刷新就能出
    问题描述在我使用form标签的action属性实现两个html页面之间的跳转,但是出现了这样的问题:问题解决我尝试将这一块内容去掉:然后再次尝试:页面出来啦~问题解决啦~~......