0

    spring boot的拦截器与过滤器介绍与对比

    2023.07.18 | admin | 145次围观

    拦截使用 RestTemplate 或 WebClient 发送的 HTTP 请求

    使用场景

    身份验证、授权、日志记录、CORS 等应用内请求处理功能

    添加认证信息、自定义请求头、请求数据处理、重试策略等服务间通信功能

    接口定义

    org.springframework.web.servlet.HandlerInterceptor

    org.springframework.http.client.ClientHttpRequestInterceptor

    需要实现的方法

    preHandle、postHandle 和 afterCompletion

    intercept

    这个表格概括了 HandlerInterceptor 和 ClientHttpRequestInterceptor 之间的主要区别。根据你的需求和使用场景,可以选择使用合适的拦截器来实现自定义的请求处理逻辑。

    过滤

    在 Spring Boot 中,过滤器(Filter)是用于在 Servlet 容器级别拦截和处理 HTTP 请求的组件。它们通常用于实现诸如身份验证、授权、日志记录、请求和响应的数据转换等功能。过滤器位于整个请求处理链的最前端,因此在请求到达 Spring 应用的任何其他组件之前,都会先经过过滤器处理。

    要在 Spring Boot 中创建一个过滤器内容拦截器有什么用,你需要执行以下步骤:

    创建一个类,实现 javax.servlet.Filter 接口。在这个类中,覆盖并实现 init(FilterConfig filterConfig)、doFilter(ServletRequest request, ServletResponse response, FilterChain chain) 和 destroy() 方法。init(FilterConfig filterConfig):初始化方法,在过滤器实例化时调用。doFilter(ServletRequest request, ServletResponse response, FilterChain chain):处理请求的核心方法。在这个方法中,你可以访问和修改请求和响应对象,并通过调用 chain.doFilter(request, response) 继续处理请求。destroy():销毁方法,在过滤器实例被销毁时调用。注册过滤器:将过滤器作为一个 Bean 注册到 Spring 应用中。以下是一个简单的过滤器示例,用于记录每个请求的处理时间:

    import javax.servlet.*;
    import javax.servlet.annotation.WebFilter;
    import javax.servlet.http.HttpServletRequest;
    import java.io.IOException;
    @WebFilter(urlPatterns = "/*")
    public class RequestTimingFilter implements Filter {
        @Override
        public void init(FilterConfig filterConfig) {
        }
        @Override
        public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
                throws IOException, ServletException {
            long startTime = System.currentTimeMillis();
            try {
                chain.doFilter(request, response);
            } finally {
                long endTime = System.currentTimeMillis();
                long duration = endTime - startTime;
                HttpServletRequest httpRequest = (HttpServletRequest) request;
                System.out.println(String.format("%s %s took %d ms", httpRequest.getMethod(), httpRequest.getRequestURI(), duration));
            }
        }
        @Override
        public void destroy() {
        }
    }
    复制代码

    要将此过滤器添加到 Spring Boot 应用中,请将其注册为 Bean:

    import org.springframework.boot.web.servlet.FilterRegistrationBean;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    @Configuration
    public class FilterConfig {
        @Bean
        public FilterRegistrationBean requestTimingFilter() {
            FilterRegistrationBean registrationBean = new FilterRegistrationBean<>();
            registrationBean.setFilter(new RequestTimingFilter());
            registrationBean.addUrlPatterns("/*");
            return registrationBean;
        }
    }
    复制代码

    现在,每次收到请求时,RequestTimingFilter 都会被调用。过滤器将记录请求的开始时间,然后在请求完成后计算处理时间,并将其输出到控制台。

    过滤器和拦截器各自优势与区别?

    spring boot的拦截器与过滤器介绍与对比

    过滤器(Filter)和拦截器(Interceptor)在某些方面的功能确实相似,但它们在使用场景、处理层级和实现方式上有所不同。以下是过滤器和拦截器之间的主要区别和各自的优势:

    处理层级:

    使用场景:

    优势:

    实现方式:

    总的来说,过滤器和拦截器在功能上有一定的重叠,但它们的使用场景、处理层级和实现方式有所不同。选择使用过滤器还是拦截器取决于你的具体需求和场景。当你需要处理与框架无关的请求时,可以使用过滤器;当你需要实现与 Spring 框架相关的功能时,拦截器可能是更好的选择。

    特征过滤器(Filter)拦截器(Interceptor)

    处理层级

    Servlet 容器级别

    Spring MVC 层级

    使用场景

    通用功能,如身份验证、授权、日志记录等

    与 Spring 框架相关的功能,如身份验证、请求参数处理等

    优势

    处理任何 Web 应用的请求,更大的控制范围

    紧密集成于 Spring MVC内容拦截器有什么用,可以访问 Spring 上下文和其他组件

    实现接口

    javax.servlet.Filter

    org.springframework.web.servlet.HandlerInterceptor 或 org.springframework.http.client.ClientHttpRequestInterceptor

    这个表格概括了过滤器(Filter)和拦截器(Interceptor)之间的主要区别。根据你的需求和使用场景,可以选择使用合适的组件来实现自定义的请求处理逻辑。

    结语

    总之,过滤器(Filter)和拦截器(Interceptor)都是 Spring Boot 中强大的请求处理工具,它们分别适用于不同的场景和需求。通过对这两种组件的深入了解,我们可以根据具体需求选择使用过滤器还是拦截器,以实现优雅、高效的请求处理逻辑。在实际项目中,我们可能需要根据不同的功能和场景组合使用过滤器和拦截器,以充分发挥它们的优势。希望本文能够帮助您更好地理解过滤器和拦截器的区别与应用,从而为您的 Web 应用提供更为稳定和安全的请求处理方案。

    版权声明

    本文仅代表作者观点。
    本文系作者授权发表,未经许可,不得转载。

    发表评论