Feign携带鉴权Token
- 新增拦截器类,拦截当前请求获取Header中鉴权token,添加到后续请求的Header中
@Configuration
public class FeignConfig implements RequestInterceptor {
@Override
public void apply(RequestTemplate requestTemplate) {
ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
if (attributes!=null){
HttpServletRequest request = attributes.getRequest();
//添加token
requestTemplate.header("Authorization", request.getHeader("Authorization"));
}
}
}
- 对指定的@FeignClient添加拦截器
@FeignClient(name = "xxx", configuration = {FeignConfig.class})
多线程下鉴权失败
场景:服务A的方法多次调用服务B的方法,报超时异常,在不想改动服务B的前提下:
- 配置Feign超时时间,无果。
feign.client.config.default.connectTimeout=5000
feign.client.config.default.read-timeout=30000。
- 考虑用多线程调用,之前配置的拦截器失效,无法正确携带Token导致鉴权失败。原因大致是子线程中无法获取到RequestAttributes,于是在主线程中取获取RequestAttributes,再传入子线程。
主线程:
// 主线程: 获取所有request数据
RequestAttributes requestAttributes = RequestContextHolder.getRequestAttributes();
LastDataTimeThread handleThread = new LastDataTimeThread(cards, i * tl, endIndex > length ? length : endIndex, countDownLatch,requestAttributes);
handleThread.start();
线程类:
@Override
public void run() {
RequestContextHolder.setRequestAttributes(requestAttributes);
}