(原)Spring多种AOP拦截方式区别
总览
方式 | 子类 | 场景 |
---|---|---|
过滤器(Filter) | 可以拿到原始的http请求,但是拿不到你请求的控制器和请求控制器中的方法的信息。 | |
拦截器(Interceptor) | 可以拿到你请求的控制器和方法,却拿不到请求方法的参数。 | |
HandlerInterceptor | 针对请求地址做一些验证、预处理等 | |
MethodInterceptor | 对一些普通的方法上的拦截 | |
ControllerAdvice | ||
切片 (Aspect) | 可以拿到方法的参数,但是却拿不到http请求和响应的对象。 |
应用
当我们希望记录请求方法的参数,会想到用Interceptor拦截,通过preHandle方法的request是可以获取到请求信息的,但是一旦request.getInputStream()被读取,postHandle将会报错,因为request中的流已被释放。
关于InputStream为什么不能被重复读取?可以看看这篇文章
参考
谈谈spring中的拦截器
Spring 拦截器—HandlerInterceptor—xml方式
Spring 拦截器—HandlerInterceptor—注解方式
Java实现inputstream流的复制
java对象克隆以及深拷贝和浅拷贝