微服务之间Token传递之@Feign

970 阅读1分钟

方法一@RequestHeader

在请求调用方的微服务方法头中添加@RequestHeader用来接收用户端请求时传入的token

image.png

@RequestMapping("/deleteByOpenId")
public Object deleteByOpenId(@RequestParam("opendId") String opendId,@RequestHeader("token") String token) {
    Object integer = appMpLoginAuthFeginClient.deleteByOpenId(opendId,token);
    return integer;
}

这里获取到header中的“token”

在采用Feign调用其他微服务时将获取到的Token传入到下一个微服务的请求头中

@RequestMapping("/rest/user-service/in/mpLoginAuth/deleteByOpenId")
Object deleteByOpenId(@RequestParam("opendId") String opendId,@RequestHeader("token") String token);

这里的@RequestHeader的意思是将参数token放入到下个请求的请求头header中。

方法二使用Feign的Interceptor

实现RequestInterceptor接口

重写RequestInterceptor接口的apply,获取到token

public class TokenRequestIntecepor implements RequestInterceptor {

    @Override
    public void apply(RequestTemplate requestTemplate) {
        // 从header获取X-token
        RequestAttributes requestAttributes = RequestContextHolder.getRequestAttributes();
        ServletRequestAttributes srat = (ServletRequestAttributes) requestAttributes;
        HttpServletRequest request = srat.getRequest();
        String token = request.getHeader("token");
        if (StringUtils.isNotBlank(token)) {
            //将token传递出去
            requestTemplate.header("token", token);
        }
    }
}

先获取到HTTPServletRequest

接着在从request中获取到header的“token”

将这个token传递给requestTemplate

Interceptor实现之后还需要对这个Interceptor设置配置

步骤二:配置Feign

application.yaml文件中添加如下配置

feign:
  client:
    config:
      default:
        loggerLevel: full
        requestInterceptors:
          - com.example.feigndemo.interceptor.TokenRequestIntecepor