Feign服务调用之间带token
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<String, String> headers = getHeaders(request); if (headers.size() > 0) { Iterator<Entry<String, String>> iterator = headers.entrySet().iterator(); while (iterator.hasNext()) { Entry<String, String> 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<String, String> getHeaders(HttpServletRequest request) { Map<String, String> map = new LinkedHashMap<>(); Enumeration<String> 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。
立志如山 静心求实
浙公网安备 33010602011771号