我们在开发Spring Boot应用程序时,经常会遇到需要对HTTP请求进行一些处理的情况,例如鉴权、数据校验、请求日志记录等等。在处理HTTP请求时,我们可以使用四种不同的技术来实现这些功能:过滤器、拦截器、ControllerAdvice和自定义AOP。
在本文中,我们将分别介绍这四种技术的概念、用法和区别,并举例说明如何在Spring Boot应用程序中使用它们来实现对HTTP请求的统一处理。
基本概念及拦截执行顺序
- 过滤器(Filter):过滤器是Java Web中的一种技术,它在请求到达Servlet之前或之后进行处理。因此,过滤器是最先执行的拦截器。在过滤器中可以进行一些通用的业务处理,例如鉴权、数据校验、请求日志记录等等。Spring Boot应用程序中注册的过滤器按照注册的顺序依次执行。
- 拦截器(Interceptor):拦截器是Spring MVC框架提供的一种技术,它在请求到达Controller之前或之后进行处理。因此,拦截器在过滤器之后执行,但在请求到达Controller之前。在拦截器中可以进行请求的修改或者一些通用的业务逻辑处理。Spring Boot应用程序中注册的拦截器按照注册的顺序依次执行。
- ControllerAdvice:ControllerAdvice是Spring MVC提供的一个注解,用于定义一个全局的异常处理器、数据绑定器和模型处理器。它可以被用于处理所有的Controller中抛出的异常和响应,对于多个Controller中重复的异常处理可以进行统一管理。ControllerAdvice在请求到达Controller之后执行,可以对Controller返回的数据进行统一处理,例如添加通用的响应头、设置统一的返回值格式等等。
- 自定义AOP(Aspect-Oriented Programming):自定义AOP是一种编程范式,它可以用于在方法调用前、后或抛出异常时添加一些横切逻辑。在Spring Boot应用程序中,自定义AOP切面可以用于对HTTP请求进行统一处理,例如获取和解析请求头信息、请求日志记录、鉴权等等。自定义AOP切面的执行顺序在拦截器之后,在请求到达Controller之前执行。
总的来说,四种拦截方式的执行顺序是过滤器->拦截器->ControllerAdvice->自定义AOP。
但是需要注意的是,这并不是绝对的顺序,具体的执行顺序还会受到过滤器链、拦截器链、AOP切入位置等因素的影响,例如
- 如果在过滤器或拦截器中调用了chain.doFilter(request, response)或handlerInterceptor.preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)方法,则会依次调用过滤器链和拦截器链的下一个过滤器或拦截器。