返回

全面解析Spring Boot HTTP请求处理之过滤器、拦截器、ControllerAdvice和自定义AOP

后端

Spring Boot HTTP 请求处理:掌握“四剑客”轻松应对

在构建 Spring Boot 应用时,处理 HTTP 请求往往是一大难题。为了帮助我们应对这些挑战,Spring Boot 提供了四种强大的“剑客”:过滤器、拦截器、ControllerAdvice 和自定义 AOP。

过滤器

过滤器是一种在请求到达 Controller 之前对其进行拦截的机制。它可以用来做权限验证、请求参数校验、请求日志记录等工作。

代码示例:

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

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) {
        // 执行过滤逻辑
        chain.doFilter(request, response);
    }
}

拦截器

拦截器是 Spring MVC 中的一种 AOP 拦截机制。它可以在 Controller 方法执行之前或之后执行一些逻辑。拦截器可以用来做权限验证、请求参数校验、请求日志记录等工作。

代码示例:

@Component
public class MyInterceptor implements HandlerInterceptor {

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {
        // 执行拦截逻辑
        return true;
    }
}

ControllerAdvice

ControllerAdvice 是一个用于处理 Controller 方法抛出的异常的机制。它可以用来对异常进行统一处理,如记录异常信息、返回友好的错误信息等。

代码示例:

@ControllerAdvice
public class MyControllerAdvice {

    @ExceptionHandler(Exception.class)
    public ResponseEntity<String> handleException(Exception ex) {
        return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(ex.getMessage());
    }
}

自定义 AOP

自定义 AOP 是一种通过创建自定义的切面(Aspect)来拦截和处理方法执行的机制。自定义 AOP 可以用来做权限验证、请求参数校验、请求日志记录等工作。

代码示例:

@Aspect
@Component
public class MyAspect {

    @Before("execution(* com.example.MyController.*(..))")
    public void beforeAdvice() {
        // 执行拦截逻辑
    }
}

横向对比

面对不同的请求处理需求,四位“剑客”各有所长:

技术 优点 缺点
过滤器 灵活,可用于任何请求 难以控制执行顺序
拦截器 可与 Spring MVC 框架无缝集成 难以控制执行顺序
ControllerAdvice 易于处理 Controller 方法抛出的异常 仅能处理 Controller 方法抛出的异常
自定义 AOP 灵活,可用于任何方法 配置复杂

合理使用

根据不同的请求处理需求,我们可以选择最合适的技术:

  1. 权限验证: 过滤器、拦截器、自定义 AOP 都可以用来做权限验证。过滤器和拦截器更适合于全局权限验证,而自定义 AOP 更适合于方法级别的权限验证。
  2. 请求参数校验: 过滤器、拦截器、自定义 AOP 都可以用来做请求参数校验。过滤器和拦截器更适合于全局参数校验,而自定义 AOP 更适合于方法级别的参数校验。
  3. 请求日志记录: 过滤器、拦截器、自定义 AOP 都可以用来做请求日志记录。过滤器和拦截器更适合于全局日志记录,而自定义 AOP 更适合于方法级别的日志记录。

常见问题解答

1. 过滤器和拦截器的区别是什么?

过滤器是一种 Servlet 级别的拦截机制,而拦截器是 Spring MVC 框架特有的 AOP 拦截机制。过滤器可以拦截任何请求,而拦截器只能拦截 Spring MVC 框架管理的请求。

2. ControllerAdvice 和自定义 AOP 的区别是什么?

ControllerAdvice 是 Spring 提供的用于处理 Controller 方法抛出异常的机制,而自定义 AOP 是我们自己创建的切面,可以拦截和处理任何方法的执行。

3. 什么时候应该使用自定义 AOP?

当我们需要在方法级别拦截请求时,并且需要更灵活的控制拦截逻辑时,应该使用自定义 AOP。

4. 过滤器、拦截器和自定义 AOP 的执行顺序是什么?

过滤器、拦截器和自定义 AOP 的执行顺序如下:

  1. 过滤器
  2. 拦截器
  3. 自定义 AOP

5. 如何控制过滤器和拦截器的执行顺序?

过滤器和拦截器的执行顺序可以通过 @Order 注解进行控制。值越小,执行顺序越靠前。