Spring过滤器和拦截器区别?

在Spring框架中,过滤器和拦截器都用于在请求处理前后执行特定操作,但它们的作用范围和实现方式有所不同。

1. 过滤器(Filter)

过滤器是Servlet规范的一部分,主要用于在请求到达Servlet之前或响应发送给客户端之前进行预处理或后处理。过滤器可以操作请求和响应的内容、头信息等。

特点:
  • 作用范围:过滤器作用于Servlet容器级别,适用于所有进入容器的请求

  • 实现方式:通过实现javax.servlet.Filter接口,在web.xml中进行配置或者使用@WebFilter注解进行声明。

  • 执行顺序:过滤器的执行顺序由web.xml中的配置顺序决定,或通过@Order注解指定。

示例:
import javax.servlet.*;
import java.io.IOException;

@WebFilter(urlPatterns = "/*")
public class MyFilter implements Filter {

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        System.out.println("过滤器初始化");
    }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        System.out.println("过滤器开始处理请求");
        chain.doFilter(request, response); // 放行
        System.out.println("过滤器开始处理响应");
    }

    @Override
    public void destroy() {
        System.out.println("过滤器销毁");
    }
}

2. 拦截器(Interceptor)

拦截器是Spring MVC框架的一部分,主要用于在控制器方法执行前后或视图渲染前后进行拦截处理。拦截器通常用于处理与业务逻辑相关的操作。

特点:
  • 作用范围拦截器作用于Spring MVC的DispatcherServlet级别,适用于Spring MVC处理的请求。

  • 实现方式:通过实现HandlerInterceptor接口或继承HandlerInterceptorAdapter类。

  • 执行顺序:拦截器的执行顺序由Spring配置决定,可以通过Order注解或配置顺序指定。

示例:
import org.springframework.web.servlet.HandlerInterceptor;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class MyInterceptor implements HandlerInterceptor {

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.out.println("拦截器处理请求");
        // 假设这里进行权限验证
        return true; // 放行
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        System.out.println("拦截器处理请求后数据");
    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        System.out.println("拦截器处理响应后");
    }
}

在Spring配置中注册拦截器:

import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

@Configuration
public class WebConfig implements WebMvcConfigurer {
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new CustomInterceptor()).addPathPatterns("/**");
    }
}

区别总结:

  1. 作用范围

    • 过滤器作用于Servlet容器级别,适用于所有请求。

    • 拦截器作用于Spring MVC级别,仅适用于Spring MVC处理的请求。

  2. 实现方式

    • 过滤器通过实现javax.servlet.Filter接口。

    • 拦截器通过实现HandlerInterceptor接口或继承HandlerInterceptorAdapter类。

  3. 执行时机

    • 过滤器在请求进入Servlet之前和响应发送给客户端之前执行。

    • 拦截器在控制器方法执行前后和视图渲染前后执行。

  4. 配置方式

    • 过滤器通常在web.xml中配置。

    • 拦截器通常在Spring配置类中通过InterceptorRegistry注册。

适用场景:

  • 过滤器:适用于需要对所有请求进行统一处理的场景,如字符编码设置、请求日志记录、权限验证等。

  • 拦截器:适用于需要对Spring MVC处理的请求进行特定业务逻辑处理的场景,如用户认证、日志记录、性能监控等。

通过合理使用过滤器和拦截器,可以在不同层次上实现对请求和响应的处理,提升应用的灵活性和可维护性。

你可能感兴趣的:(Spring,spring,java,后端)