filter,interceptor,controllerAdvice,aspect,controller執行順序
阿新 • • 發佈:2020-09-23
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