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