碰到的一个异步调用丢失请求头的问题:https://blog.csdn.net/MarkusZhang/article/details/107888599
FeignClientInterceptor:
@Component
public class FeignClientInterceptor implements RequestInterceptor {
@Override
public void apply(RequestTemplate template) {
// 或者从当前请求上下文中获取
ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
if (attributes != null) {
String authorizationHeader = attributes.getRequest().getHeader("Authorization");
if (authorizationHeader != null) {
template.header("Authorization", authorizationHeader);
}
}
}
}
FeignConfig:
@Configuration
public class FeignConfig {
@Bean
public FeignClientInterceptor feignClientInterceptor() {
return new FeignClientInterceptor();
}
}
cleint:
@FeignClient(value = "testClient",url = "localhost:8080",path = "/test", configuration = FeignConfig.class)
public interface testClient {
@PostMapping("/time")
List<DataVo> findByTime(@RequestParam(required = false) String dateTime);
}
接口的调用:
@PostMapping("/dataOverview")
public ResponseModel dataOverview(@RequestParam(required = false) String appName, @RequestParam(required = false) String dateTime) {
RequestAttributes requestAttributes = RequestContextHolder.getRequestAttributes();
// 创建 CompletableFuture 任务
CompletableFuture<List<DataVo>> test1Future = getTest1List(dateTime);
CompletableFuture<List<DataVo>> test2Future = getTest2List(dateTime);
// 组合所有 CompletableFuture 任务
return CompletableFuture.allOf(test1Future , test2Future )
.thenApply(v -> {
try {
// 获取所有异步任务的结果
List<DataVo> dataVoList1 = test1Future .get();
log.info("dataVoList1 【{}】",dataVoList1 );
List<DataVo> dataVoList2 = test1Future .get();
log.info("dataVoList2 【{}】",dataVoList2 );
// 构建 返回对象
ResultVo vo = new ResultVo ();
return ResponseModel.success(vo);
} catch (Exception e) {
log.error("异步异常【{}】",e.getMessage(),e);
return ResponseModel.success(e.getMessage());
}
})
.exceptionally(ex ->{
log.error("总异常【{}】",ex.getMessage(),ex);
return ResponseModel.error(ex.getMessage());
})
.join();
}
private CompletableFuture<List<DataVo>> getTest1List(RequestAttributes requestAttributes,String appName, String dateTime) {
return CompletableFuture.supplyAsync(() -> {
// 异步请求需要重新设置请求头,然后再feigin的拦截器中重新设置。
RequestContextHolder.setRequestAttributes(requestAttributes);
return testClient.findByTime(dateTime);
});
}
pom文件:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
2025-01-14 start:
我们可以通过直接设置header来传递token
@FeignClient(name = "yourServiceName", url = "${your.service.url}")
public interface YourServiceClient {
@GetMapping("/your-endpoint")
ResponseEntity<String> yourMethod(@RequestHeader("Authorization") String authorization);
}
end