1、使用@RequestHeader注解添加参数到请求头中去
@FeignClient(name = "capability-register", fallback = ApiServiceClientFallBack.class )
public interface ApiServiceClient {
@GetMapping("/apiDebug/")
Result debug(@RequestParam("url") String path,
@RequestParam("param") String param,
@RequestParam("method") String method,
@RequestParam("appKey") String appKey,
@RequestHeader(name = "Token",required = true) String Token);
}
2、对所有的feign调用统一设置请求头
import org.springframework.context.annotation.Configuration;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import java.util.Enumeration;
import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Objects;
import javax.servlet.http.HttpServletRequest;
import feign.RequestInterceptor;
import feign.RequestTemplate;
@Configuration // 加上该注解 ,则不需要FeignClient里面加属性configuration
public class FeignHeadersInterceptor implements RequestInterceptor {
@Override public void apply(RequestTemplate template) {
HttpServletRequest request = getHttpServletRequest();
if (Objects.isNull(request)) {
return;
}
Map headers = getHeaders(request);
if (headers.size() > 0) {
Iterator iterator = headers.entrySet().iterator();
while (iterator.hasNext()) {
Entry entry = iterator.next();
// 把请求过来的header请求头 原样设置到feign请求头中
// 包括token
template.header(entry.getKey(), entry.getValue());
}
}
}
private HttpServletRequest getHttpServletRequest() {
try {
// 这种方式获取的HttpServletRequest是线程安全的
return ((ServletRequestAttributes) (RequestContextHolder.currentRequestAttributes())).getRequest();
} catch (Exception e) {
return null;
}
}
private Map getHeaders(HttpServletRequest request) {
Map map = new LinkedHashMap();
Enumeration enums = request.getHeaderNames();
while (enums.hasMoreElements()) {
String key = enums.nextElement();
String value = request.getHeader(key);
map.put(key, value);
}
return map;
}
}
getHttpServletRequest方法获取Request请求,而getHeaders从Request中拿到请求头信息,最后设置到RequestTemplate的headers中,而RequestTemplate就相当于feign客户端的HttpClient。
|