-
前言:在我们token进行鉴权操作时,使用feign进行请求转发会导致请求头的丢失,这个时候就需要进行请求头的传递操作
1. 创建feign拦截器
@Component
public class FeignRequestInterceptor implements RequestInterceptor {
@Override
public void apply(RequestTemplate requestTemplate) {
ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder
.getRequestAttributes();
if (Objects.isNull(attributes)){
return;
}
HttpServletRequest request = attributes.getRequest();
Enumeration<String> headerNames = request.getHeaderNames();
if (headerNames != null) {
while (headerNames.hasMoreElements()) {
String name = headerNames.nextElement();
String values = request.getHeader(name);
requestTemplate.header(name, values);
}
}
}
}
2. Hystrix透传ThreadLocal数据
@Component
public class RequestAttributeHystrixConcurrencyStrategy extends HystrixConcurrencyStrategy {
public RequestAttributeHystrixConcurrencyStrategy() {
try {
HystrixPlugins.reset();
HystrixPlugins.getInstance().registerConcurrencyStrategy(this);
}
catch (Exception e) {
e.printStackTrace();
}
}
@Override
public <T> Callable<T> wrapCallable(Callable<T> callable) {
RequestAttributes requestAttributes = RequestContextHolder.getRequestAttributes();
return new Callable<T>() {
@Override
public T call() throws Exception {
RequestContextHolder.setRequestAttributes(requestAttributes);
return callable.call();
}
};
}
}