feign 局部配置覆盖全局配置问题
背景:用的底层封装的框架,搞了个全局feign的配置,在RequestInterceptor 拦截器那里将request的请求头又放到了feign头里面,还是这个框架,在对所有的请求做拦截的时候,直接判断请求头里面token这个字段有没有值,有值得话就去解析token, 然后没有解析成功就报错。
这样其实只有服务用的同一个secret才没问题,如果不同得系统用的不同sercret,两边调用就直接报解析token失败了。
处理过程
当时想着就直接在每个feign添加一个局部拦截器,再把请求头token这个字段得值置为空,结果试了下,给这个局部拦截器最低优先级,每次请求进来还是先执行局部的配置,再执行全局的配置,然后百度了半天,好像也没找到啥方案,没办法,就想出了两种方案:
-
将HttpServerletRequest中的请求头token置为空 ,feign转发请求头就是从这里获取的,那就在局部配置这里把token置为空;
-
看下底层到底怎么实现的,有无提供方法第一种方案也挺麻烦的,HttpServerletRequest并没有直接提供改变头参数的方法;
感觉第一种太麻烦,觉得应该也有可以让局部配置的拦截器最后执行的方法。所以开始debug了,最后找到了在BeanFactoryUtils类中
代码片
.
private static String[] mergeNamesWithParent(String[] result, String[] parentResult, HierarchicalBeanFactory hbf) {
if (parentResult.length == 0) {
return result;
}
List<String> merged = new ArrayList<>(result.length + parentResult.length);
merged.addAll(Arrays.asList(result));
for (String beanName : parentResult) {
if (!merged.contains(beanName) && !hbf.containsLocalBean(beanName)) {
merged.add(beanName);
}
}
return StringUtils.toStringArray(merged);
}
说明
result就是局部配置,parentResult 是全局配置, 源代码是写死的,它是先添加完局部配置,再添加全局配置,所有怎么搞都是先执行局部配置再全局,但是添加全局的时候加了个条件,只要局部的bean名字和全局的一直就不添加全局的了,就相当于把这个全局的配置覆盖了,所以只要局部的bean名字和全局的一样就行了。