ClientHttpRequestInterceptor的intercept方法调用顺序及与连接池取连接先后问询
ClientHttpRequestInterceptor 常见问题解答
1. intercept方法的调用顺序
ClientHttpRequestInterceptor的执行顺序和你向RestTemplate注册拦截器的顺序完全一致:
- 你可以通过
RestTemplate.setInterceptors(List<ClientHttpRequestInterceptor> interceptors)方法传入自定义拦截器列表,列表中排序越靠前的拦截器,越先执行intercept方法 - 请求处理阶段的执行顺序是:先注册的拦截器先执行,所有拦截器都执行完成后才会发起实际请求
- 响应处理阶段的执行顺序和请求阶段相反:后注册的拦截器会先处理响应结果,再逐层回传给先注册的拦截器
2. intercept方法的调用时机
intercept方法的调用是在RestTemplate从连接池获取连接之前,完整的执行链路顺序如下:
- 业务代码调用
RestTemplate的请求方法(如getForObject、exchange等) - 按注册顺序依次执行所有
ClientHttpRequestInterceptor的intercept方法,可在此阶段修改请求头、请求参数、打印请求日志,或是直接返回自定义响应终止请求链路 - 所有拦截器请求预处理完成后,才会进入实际HTTP请求执行逻辑:包括从连接池获取空闲连接、建立TCP连接(无可用空闲连接时)、发送请求报文、接收服务端响应
- 按注册逆序依次执行所有拦截器的响应处理逻辑
- 最终将处理后的响应返回给业务代码
这种设计的核心目的是避免连接资源浪费:如果拦截器预处理阶段就判定请求非法、或是触发限流降级规则,可直接返回结果,无需占用连接池的连接资源。
内容的提问来源于stack exchange,提问作者Arpit Tomar
相关产品推荐
相关产品推荐

