1. 程式人生 > 實用技巧 >filter,interceptor,controllerAdvice,aspect,controller執行順序

filter,interceptor,controllerAdvice,aspect,controller執行順序

1、filter,這是java的過濾器,和框架無關的,是所有過濾元件中最外層的,從粒度來說是最大的。

配置方式,有直接實現Filter+@component,@Bean+@configuration(第三方的filter)

2、interceptor,spring框架的攔截器

配置方式,@configuration+繼承WebMvcConfigurerAdapter或WebMvcConfigurationSupport類新增過濾器。

  • 繼承WebMvcConfigurationSupport不需要宣告@EnableWebMvc註解,繼承WebMvcConfigurerAdapter需要 @see org.springframework.web.servlet.config.annotation.EnableWebMvc
  • @RestController的類和帶@ResponseBody的方法在被呼叫後response會直接寫入輸出流,在postHandle和afterCompletion這兩個方法執行之前就已經把資料返回,導致這兩個方法裡面的response根本獲取不到響應資料
    https://blog.csdn.net/codeblf2/article/details/102732255

3、aspect,可以自定義要切入的類甚至再細的方法,粒度最小。加個註解用效果更佳。

4、controllerAdvice,是controller的增強,和ExceptionHandler一起用來做全域性異常。也可以配合ResponseBodyAdvice介面來對@ResponseBody的返回資料進行加工再返回(同理還有RequestBodyAdvice-> @RequestBody等)

@ControllerAdvice
public class StringResponseBodyAdvice implements ResponseBodyAdvice<String> {


    @Override
    public boolean supports(MethodParameter returnType, Class converterType) {
        return true;
    }


    @Override
    public String beforeBodyWrite(String body, MethodParameter returnType, MediaType selectedContentType, Class selectedConverterType, ServerHttpRequest request, ServerHttpResponse response)             
    {
        return body;
    }
}

總結:

filter:和框架無關,可以控制最初的http請求,但是更細一點的類和方法控制不了。

interceptor:可以控制請求的控制器和方法,但控制不了請求方法裡的引數。

aspect : 可以自定義切入的點,有方法的引數,但是拿不到http請求,可以通過其他方式如RequestContextHolder獲得。

https://blog.csdn.net/m0_37664906/article/details/88546641
https://www.jianshu.com/p/2d1fa2834d9c