SpringBoot Fegin 调用传token

1,299 阅读1分钟

最近在做一个项目的时候,A应用通过restful接口暴露给前台,前台访问的时候会在header中加入token信息,A应用接口在后端通过fegin的方式调用B应用提供的服务,这个时候总是调用失败。 通过Xrebel的拦截请求分析,发现调用B应用的时候少了token信息,导致B应用鉴权不通过

解决方案

  1. 实现RequestInterceptor接口 如下(可以自定义类加上@component或者直接在启动类中使用@bean注解)

    @Bean
	public RequestInterceptor RequestInterceptorrequestTokenBearerInterceptor() {
		return new RequestInterceptor() {
			@Override
			public void apply(RequestTemplate requestTemplate) {
				ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
				HttpServletRequest request = attributes.getRequest();
				requestTemplate.header("Authorization", request.getHeader("Authorization"));
			}

		};

	}
	

重点配置

hystrix:
  command:
    default:
      execution:
        isolation:
          strategy: SEMAPHORE
	

如果没有增加上述配置,在上面的实现类中无法获取request对象,没法获取当前请求的token

  1. @Header注解 在fegin的调用的接口类的方法上增加@Header 注解
 @FeignClient(url = "XX_url", value = "XXService")
public interface XXService {
 
    @RequestMapping(value = "/xx", method = RequestMethod.POST)
    @Headers({"Content-Type: application/json","Accept: application/json"})
    String sendDing(String params);
}