在Spring Boot中,过滤器(Filter)、拦截器(Interceptor)和AOP(面向切面编程)都用于在应用程序的不同层之间添加通用的逻辑处理,但它们有不同的应用场景和实现方式:
- 过滤器(Filter):
 
- 应用场景:用于处理HTTP请求和响应,可以在Servlet前后处理请求和响应。
 - 实现方式:实现javax.servlet.Filter接口。
 - 使用:在Spring Boot应用中通过@WebFilter注解或者在application配置中注册。
 - 执行顺序:按照注册或代码顺序执行。
 
- 拦截器(Interceptor):
 
- 应用场景:用于Spring MVC的Controller层,可以在Controller方法前后处理请求和响应。
 - 实现方式:实现org.springframework.web.servlet.HandlerInterceptor接口。
 - 使用:通过实现WebMvcConfigurer接口,并重写addInterceptors方法添加拦截器。
 - 执行顺序:按照注册或代码顺序执行。
 
- AOP(Aspect-Oriented Programming):
 
- 应用场景:用于处理非web请求的业务逻辑,如服务层、数据访问层等。
 - 实现方式:使用AspectJ的注解或者XML配置。
 - 使用:通过@Aspect注解标注一个类,并使用@Before、@After、@Around等注解标注方法。
 - 执行顺序:根据切点定义和@Order注解指定的顺序执行。
 
示例代码:
过滤器(Filter):
@WebFilter(filterName = "exampleFilter", urlPatterns = "/*")
public class ExampleFilter implements Filter {
    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        // 在请求处理前执行的逻辑
        // ...
        chain.doFilter(request, response); // 继续执行其他的Filter或Servlet
        // 在请求处理后执行的逻辑
        // ...
    }
}
拦截器(Interceptor):
@Component
public class ExampleInterceptor implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {
        // 在Controller处理前执行的逻辑
        // ...
        return true; // 继续执行请求
    }
 
    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) {
        // 在Controller处理后,返回视图渲染前执行的逻辑
        // ...
    }
 
    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) {
        // 在整个请求结束后执行的逻辑
        // ...
    }
}
 
@Configuration
public class WebConfig implements WebMvcConfigurer {
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new ExampleInterceptor());
    }
}
AOP:
@Aspect
@Component
public class ExampleAspect {
    @Before("execution(* com.example.service.*.*(..))")
    public void beforeMethod(JoinPoint joinPoint) {
        // 在Service层方法执行前执行的逻辑
        // ...
    }
 
    @After("execution(* com.example.service.*.*(..))")
    public void afterMethod(JoinPoint joinPoint) {
        // 在Service层方法执行后执行