Interceptor

HttpRequest处理过程中,有时可能需要执行Retry、Redirect、Cache等操作,使用Interceptor可以实现类似功能。

Filter的区别

Filter不同的是,在Interceptor中 可以同时获取HttpRequest及经过处理后的HttpResponse,甚至可以替换原始的HttpRequest及处理后的HttpResponse。更多与Filter的不同如下:

  1. 执行时机不同:RequestFilter在所有拦截器对HttpRequest的处理之后才会执行,ResponseFilter在响应头接收到之后(响应body处理前)立即执行,此时所有拦截器对HttpResponse的处理均未执行。
  2. 关联性不同:Interceptor中可以获取HttpRequest经过处理后的HttpResponse,通过此种方式可以将请求和响应关联起来,而RequestFilterResponseFilter中均无法同时获取到请求和响应,因此 也不能将两者关联起来,但是同一个请求将在RequestFilterResponseFilter中共享一个FilterContext实例,因此可以通过该对象传递上下文参数。
  3. 通过拦截器可以替换HttpRequestHttpResponse,而通过Filter无法实现。

鉴于InterceptorFilter的区别,下述场景更适合使用Interceptor

  1. 需要同时处理HttpRequestHttpResponse,如重试、重定向等(因为需要获取HttpRequest处理结果后的HttpResponse再决定下一步处理逻辑)。
  2. HttpRequest处理过程中仅需要执行一次的逻辑,同时需要注意该类拦截器的优先级要高于重试、重定向等内置拦截器,否则发生重试、重定向时该拦类拦截器仍会被 多次执行。
  3. 需要替换原始的HttpRequest或处理后的HttpResponse

内置Interceptor

HttpClient中存在一些内置Interceptor,用于实现 100-expect-continue、重试、重定向 等功能。

使用方式

HttpClient支持通过builder配置和SPI加载两种方式配置Interceptor


Last modified February 18, 2022: complete document migration (#126) (1375641)