我们在项目中使用feign进行调用时,往往需要进行身份验证,而feignclient需要按照http调用方的格式来书写,这时候呢,我们可以使用这种方式来进行加入身份验证。
public class FeignConfig implements RequestInterceptor {
@Override
public void apply(RequestTemplate requestTemplate) {
ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
HttpServletRequest request = attributes.getRequest();
//添加token
requestTemplate.header("Authorization", request.getHeader("Authorization"));
}
}
当然,这里可以传入你所有想加入的参数,包括token啊,cookie,或者其他自定义的参数。 然后在feignclient的时候加入该配置就可以了
@FeignClient(contextId = "xxx",value = "xx",configuration = FeignClient.class);
但是这样的话,每一个定义的feignclient都需要去加这个配置,感觉比较麻烦, 然后查看源码 FeignClientsRegistrar
public void registerBeanDefinitions(AnnotationMetadata metadata,
BeanDefinitionRegistry registry) {
registerDefaultConfiguration(metadata, registry);
registerFeignClients(metadata, registry);
}
这里有2个方法,一个是加载默认配置,一个是注册bean,而在注册bean的时候,加载了我们刚才的配置。
if (candidateComponent instanceof AnnotatedBeanDefinition) {
// verify annotated class is an interface
AnnotatedBeanDefinition beanDefinition = (AnnotatedBeanDefinition) candidateComponent;
AnnotationMetadata annotationMetadata = beanDefinition.getMetadata();
Assert.isTrue(annotationMetadata.isInterface(),
"@FeignClient can only be specified on an interface");
Map<String, Object> attributes = annotationMetadata
.getAnnotationAttributes(
FeignClient.class.getCanonicalName());
String name = getClientName(attributes);
registerClientConfiguration(registry, name,
attributes.get("configuration"));
registerFeignClient(registry, annotationMetadata, attributes);
}
而默认配置registerDefaultConfiguration(metadata, registry);
private void registerDefaultConfiguration(AnnotationMetadata metadata,
BeanDefinitionRegistry registry) {
Map<String, Object> defaultAttrs = metadata
.getAnnotationAttributes(EnableFeignClients.class.getName(), true);
if (defaultAttrs != null && defaultAttrs.containsKey("defaultConfiguration")) {
String name;
if (metadata.hasEnclosingClass()) {
name = "default." + metadata.getEnclosingClassName();
}
else {
name = "default." + metadata.getClassName();
}
registerClientConfiguration(registry, name,
defaultAttrs.get("defaultConfiguration"));
}
}
由Map<String, Object> defaultAttrs = metadata
.getAnnotationAttributes(EnableFeignClients.class.getName(), true);这个可知,默认的配置是在EnableFeignClients里进行设置的,所以,通用的配置我们也找到了,直接在EnableFeignClients里设置@EnableFeignClients(basePackages = {"xxx.xxx.xxx"},defaultConfiguration = FeignConfig.class) 这样在FeignClient就不用去每个都设置了。