SpringCloud -Token传递之Feign
作者:mmseoamin日期:2023-12-11

🌺个人主页:杨永杰825_Spring,Mysql,多线程-CSDN博客

⭐每日一句:成为架构师路途遥远

📢欢迎大家:关注🔍+点赞👍+评论📝+收藏⭐️

目录

方法一 @RequestHeader

方法二 使用Feign的Interceptor

步骤一 实现RequestInterceptor接口

步骤二:配置Feign


SpringCloud -Token传递之Feign,第1张

通常微服务对于用户认证信息解析有两种方案

  • 在 gateway 就解析用户的 token 然后路由的时候把 userId 等相关信息添加到 header 中传递下去。
  • 在 gateway 直接把 token 传递下去,每个子微服务自己在过滤器解析 token

    现在有一个从 A 服务调用 B 服务接口的内部调用业务场景,无论是哪种方案我们都需把 header 从 A 服务传递到 B 服务。

    方法一 @RequestHeader


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

    @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接口

    SpringCloud -Token传递之Feign,第2张


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

    public class TokenRequestIntecepor implements RequestInterceptor {
        @Override
        public void apply(RequestTemplate requestTemplate) {
            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); } } }
            }
        }
    }
    1. 先获取到HTTPServletRequest
    2. 接着在从request中获取到header的“token”
    3. 将这个token传递给requestTemplate
    4. Interceptor实现之后还需要对这个Interceptor设置配置

    步骤二:配置Feign

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

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