项目场景:
微服务之间跨服务调用使用
问题描述:
feign在调用其他服务过程中没有把token带过去
自定义feign
/**
* Fegin动态调用
*/
//导入SpringCloud默认的Feign配置
@Import(FeignClientsConfiguration.class)
@Component
public class CommonFeginApi {
CommonFeginService commonFeginService;
Feign.Builder builder;
//创建构造器
public CommonFeginApi(Decoder decoder, Encoder encoder, Client client, Contract contract) {
this.builder = Feign.builder()
.client(client)
.encoder(encoder)
.decoder(decoder)
.contract(contract);
}
public void apiExcute(Map<String,Object> map,String serviceName,String apiUrl){
//http://rw-common-server/apiconfig/workFlowApi
this.commonFeginService = this.builder.target(CommonFeginService.class,"http://"+serviceName+apiUrl);
R r = this.commonFeginService.dynamicApi(map);
}
}
feign拦截器
@Configuration
public class FeignInterceptor implements RequestInterceptor {
@Override
public void apply(RequestTemplate requestTemplate) {
try {
if(RequestContextHolder.getRequestAttributes() != null){
HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
Enumeration<String> enumeration = request.getHeaderNames();
while (enumeration.hasMoreElements()) {
String key = enumeration.nextElement();
String value = request.getHeader(key);
//获取到信息放到请求头中
requestTemplate.header(headerName, headers.get(headerName));
}
}catch (Exception e){
e.printStackTrace();
}
}
}
原因分析:
因为是自定义feign一些属性并没有携带,拦截器拦截不到
解决方案:
加上.requestInterceptor(new FeignInterceptor()); 让拦截器拦截