feign传递http请求是有自己的对象 RequestTemplate ,会过滤掉一些敏感头部信息,比如用户信息,token等。
可以用过如下方式,传统想传递的header。
第一步:设置hystrix的隔离策略
properties 配置文件配置
hystrix.command.default.execution.isolation.strategy = SEMAPHORE
这一步必须添加,否则第二步中的 :RequestContextHolder.getRequestAttributes() 会为空
第二步:添加请求拦截器
代码如下:(这里以 “user” 头部信息为例,对象判空用到了hutool,字符串判空用了lang3)
import cn.hutool.core.util.ObjectUtil;
import feign.RequestInterceptor;
import feign.RequestTemplate;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import javax.servlet.http.HttpServletRequest;
/**
* 传递头部用户信息
*/
public class FeignBasicAuthRequestInterceptor implements RequestInterceptor {
private final Logger log = LoggerFactory.getLogger(FeignBasicAuthRequestInterceptor.class);
@Override
public void apply(RequestTemplate requestTemplate) {
ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder
.getRequestAttributes();
RequestContextHolder.setRequestAttributes(attributes, true);
if(ObjectUtil.isNull(attributes))return;
HttpServletRequest request = attributes.getRequest();
String userInfo = request.getHeader("user");
if(StringUtils.isNotBlank(userInfo)){
requestTemplate.header("user",request.getHeader("user"));
}
}
}
第三步:添加Feign配置对象
代码如下:
import feign.RequestInterceptor;
import org.springframework.context.annotation.Bean;
public class FeignHeaderConfig{
@Bean
public RequestInterceptor requestInterceptor(){
return new FeignBasicAuthRequestInterceptor();
}
}
第四步:在Feign客户端中声明使用以上配置
代码如下:
@FeignClient(value = FeignClientName.template,configuration = FeignHeaderConfig.class)
public interface TemplateService {}