Spring Boot中的过滤器拦截器监听器使用技巧汇总

 更新时间:2023年12月06日 09:29:26   作者:bug菌  
本文将介绍在Spring Boot应用程序中使用过滤器、拦截器和监听器的使用技巧,我们将讨论它们之间的区别,以及何时使用它们,我们还将提供代码示例,以帮助您在自己的应用程序中使用它们

前言 

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

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

过滤器

过滤器是在请求进入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)

优点:

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

缺点:

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

拦截器(Interceptor):

优点:

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

缺点:

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

监听器(Listener):

优点:

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

缺点:

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

三者对比

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

过滤器(Filter)

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

拦截器(Interceptor)

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

监听器(Listener)

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

总结

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

附录源码

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

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

以上就是Spring Boot中的过滤器拦截器监听器技巧汇总的详细内容,更多关于Spring Boot过滤器拦截器监听器的资料请关注脚本之家其它相关文章!

相关文章

  • Java由浅入深通关抽象类与接口下

    Java由浅入深通关抽象类与接口下

    在类中没有包含足够的信息来描绘一个具体的对象,这样的类称为抽象类,接口是Java中最重要的概念之一,它可以被理解为一种特殊的类,不同的是接口的成员没有执行体,是由全局常量和公共的抽象方法所组成,本文给大家介绍Java抽象类和接口,感兴趣的朋友一起看看吧
    2022-04-04
  • Java中String的JdbcTemplate连接SQLServer数据库的方法

    Java中String的JdbcTemplate连接SQLServer数据库的方法

    这篇文章主要介绍了Java中String的JdbcTemplate连接SQLServer数据库的方法,在研发过程中我们需要与其他系统对接的场景,连接SQLServer拉取数据,所以就用jdbc连接数据库的方式连接外部数据源,需要的朋友可以参考下
    2021-10-10
  • Java源码解析阻塞队列ArrayBlockingQueue介绍

    Java源码解析阻塞队列ArrayBlockingQueue介绍

    今天小编就为大家分享一篇关于Java源码解析阻塞队列ArrayBlockingQueue介绍,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2019-01-01
  • Java 实现万年历总结

    Java 实现万年历总结

    这篇文章主要介绍了Java 万年历实现代码的相关资料,需要的朋友可以参考下
    2016-09-09
  • 基于JSON实现传输byte数组过程解析

    基于JSON实现传输byte数组过程解析

    这篇文章主要介绍了基于JSON实现传输byte数组过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-06-06
  • Springboot使用filter对response内容进行加密方式

    Springboot使用filter对response内容进行加密方式

    这篇文章主要介绍了Springboot使用filter对response内容进行加密方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-03-03
  • Java HashMap三种循环遍历方式及其性能对比实例分析

    Java HashMap三种循环遍历方式及其性能对比实例分析

    这篇文章主要介绍了Java HashMap三种循环遍历方式及其性能对比,结合具体实例形式分析了Java HashMap三种循环遍历方式的实现方法、运行效率及性能优劣,需要的朋友可以参考下
    2019-10-10
  • Swing中依据鼠标拖拽来画出矩形的实现方法

    Swing中依据鼠标拖拽来画出矩形的实现方法

    这篇文章主要介绍了Swing中依据鼠标拖拽来画出矩形的实现方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-11-11
  • java面试try-with-resources问题解答

    java面试try-with-resources问题解答

    这篇文章主要介绍了java面试try-with-resources问题解答, 这个语句的作用是,确保该语句执行之后,关闭每一个资源,也就是说它确保了每个资源都在生命周期结束之后被关闭
    2022-07-07
  • Java超详细梳理IO流的使用方法上

    Java超详细梳理IO流的使用方法上

    流(Stream)是指一连串的数据(字符或字节),是以先进先出的方式发送信息的通道,数据源发送的数据经过这个通道到达目的地,按流向区分为输入流和输出流
    2022-04-04

最新评论