在springcloud框架使用Feign搭建服务之间的接口时,启用熔断器Hystrix时,发现接口的auth统一认证生效,而导致接口调用401报错。
为了跑通接口,尝试了很多种不同的方法
一、接口校验忽略
客户端忽略认证需要调用的接口,接口不需要通过认证就不会报错了(可方法就失去认证的功能,或获取token用户的信息)
security.ignored=/service/deploy/**
二、不想忽略接口,继续尝试
需要传递在服务端对请求的header中补充Authorization属性值
springcloud Fegin框架提供了一个RequestInterceptor拦截器,对Feign发起的请求进行拦截
如代码所示,给Fegin发起的请求加上当前上下文RequestContextHolder的header信息,这样请求就有Authorization认证参数了。
(Feign也是一个HTTP协议发送请求,相当于一个封装好的HttpClient服务,会启动一个新的request请求接口,而并非类似网关那样把原request请求转发到接口,所以header的参数就丢失了。)
import feign.RequestInterceptor;
import feign.RequestTemplate;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import javax.servlet.http.HttpServletRequest;
import java.util.Enumeration;
import java.util.LinkedHashMap;
import java.util.Map;
@Configuration
public class FeignConfig implements RequestInterceptor {
@Override
public void apply(RequestTemplate template) {
HttpServletRequest httpServletRequest = getHttpServletRequest();
if(httpServletRequest!=null){
Map<String, String> headers = getHeaders(httpServletRequest);
// 传递所有请求头,防止部分丢失
//此处也可以只传递认证的header
//requestTemplate.header("Authorization", request.getHeader("Authorization"));
for (Map.Entry<String, String> entry : headers.entrySet()) {
template.header(entry.get