腾讯面试:过滤器和拦截器的区别是什么?答不上来,如鲠在喉?看看这篇吧

2024-09-26 13:07:09 浏览数 (3)

大家好,我是程序员牛肉。

相信很多同学都会都会在自己的简历上写“了解Spring MVC”,结果面试官一问:“介绍一下Spring mvc中的过滤器和拦截器”。瞬间傻了眼。

你了解什么是过滤器和拦截器以及他们二者的区别嘛?如果不了解的话,就看看这篇文章吧。

「Spring MVC PART1

过滤器」

在Spring MVC中,过滤器(Filter)是一种用于拦截请求和响应的组件,可以在请求到达控制器之前或响应发送给客户端之前对它们进行处理。过滤器主要用于以下目的:

  • 日志记录:记录请求和响应的详细信息,用于调试和监控。
  • 安全控制:实现认证和授权,确保只有合适的用户可以访问特定的资源。
  • 请求修改:在请求到达控制器之前修改请求参数或头信息。
  • 响应修改:在响应发送给客户端之前修改响应的内容或状态码。
  • 资源压缩:对响应内容进行压缩,减少网络传输的数据量。
  • 请求转发:将请求转发到不同的URL或控制器。

生命周期:

过滤器的生命周期通常与Web应用程序的生命周期相同。当Web应用程序启动时,过滤器被初始化;当Web应用程序关闭时,过滤器被销毁。

并且Spring MVC允许多个过滤器组成一个过滤器链。请求首先通过第一个过滤器,然后依次通过过滤器链中的其他过滤器,最后到达控制器。响应则按相反的顺序通过过滤器链。

尝试注册一个过滤器:

代码语言:javascript复制
@Configuration
public class WebConfig implements WebMvcConfigurer {

    @Override
    public void addFilters(FilterRegistry registry) {
        CharacterEncodingFilter characterEncodingFilter = new CharacterEncodingFilter();
        characterEncodingFilter.setEncoding("UTF-8");
        characterEncodingFilter.setForceEncoding(true);
        
        registry.addFilter(characterEncodingFilter);
    }
}

在这个例子中,我们创建了一个字符编码过滤器CharacterEncodingFilter,并将其注册到Spring MVC的过滤器链中

注意事项

  • 过滤器应该小心使用,因为它们可以改变请求和响应的流程,可能会影响应用程序的行为。
  • 过滤器的执行顺序很重要,因为它决定了请求和响应通过过滤器链的顺序。
  • 过滤器应该尽量保持轻量级,避免执行复杂的逻辑,以免影响Web应用程序的性能。

「Spring MVC

PART1

拦截器」

Spring MVC中,拦截器(Interceptor)是一种用于拦截请求和响应的组件,类似于过滤器,但提供了更多的灵活性和控制能力。拦截器主要用于以下目的:

  • 日志记录:记录请求和响应的详细信息,用于调试和监控。
  • 安全控制:实现认证和授权,确保只有合适的用户可以访问特定的资源。
  • 请求修改:在请求到达控制器之前修改请求参数或头信息。
  • 响应修改:在响应发送给客户端之前修改响应的内容或状态码。
  • 事务管理:管理事务的开始和结束,确保数据的一致性。
  • 性能监控:监控请求处理时间,分析性能瓶颈。

拦截器的生命周期:

拦截器的生命周期与请求的生命周期相关。每个请求都会创建一个新的拦截器实例,请求结束后,拦截器实例会被销毁。

Spring MVC允许多个拦截器组成一个拦截器链。请求首先通过preHandle方法,然后依次通过拦截器链中的其他拦截器的preHandle方法,最后到达控制器。响应则按相反的顺序通过拦截器的postHandle和afterCompletion方法。

尝试创建一个拦截器:

代码语言:javascript复制
@Configuration
public class WebConfig implements WebMvcConfigurer {

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new MyInterceptor())
            .addPathPatterns("/**") // 拦截所有请求
            .excludePathPatterns("/ignore", "/api/**"); // 排除某些路径
    }
}

注意事项

  • 拦截器的preHandle方法可以决定是否继续执行请求链。如果返回false,则请求将不会到达控制器。
  • postHandle方法在请求处理之后,视图渲染之前调用,可以用来修改响应模型。
  • afterCompletion方法在请求完成后调用,可以用来进行清理工作或记录日志。
  • 拦截器的执行顺序很重要,因为它决定了请求和响应通过拦截器链的顺序。
  • 拦截器应该尽量保持轻量级,避免执行复杂的逻辑,以免影响Web应用程序的性能。

SPRING HAS ARRIVED

过滤器与拦截器的区别

过滤器和拦截器的区别:

实现方式:

  • 过滤器:基于Java Servlet规范,实现javax.servlet.Filter接口。
  • 拦截器:基于Spring框架,实现org.springframework.web.servlet.HandlerInterceptor接口。

调用时机:

  • 过滤器:在请求进入后、离开前调用,可以在请求进入控制器之前进行预处理,也可以在响应发送给客户端之前进行后处理。
  • 拦截器:在请求处理的不同阶段调用,包括preHandle(请求处理前)、postHandle(请求处理后、视图渲染前)和afterCompletion(请求完成后)。

调用顺序:

  • 过滤器:通常按照在web.xml或Spring配置中定义的顺序执行。
  • 拦截器:可以更灵活地控制执行顺序,例如,可以在preHandle方法中决定是否执行后续拦截器或控制器。

作用范围:

  • 过滤器:可以应用于整个Web应用程序,不仅限于Spring MVC。
  • 拦截器:专门用于Spring MVC应用程序,可以更精确地控制Spring MVC的请求处理流程。

事务管理:

  • 过滤器:通常不涉及事务管理。
  • 拦截器:可以在preHandle方法中开启事务,在afterCompletion方法中关闭事务,从而实现事务的控制。

我们用一张图就可以很好的描述过滤器和拦截器的作用范围:

相信通过我的介绍,你已经了解什么是拦截器和过滤器,希望我的文章可以帮到你。

0 人点赞