zoukankan      html  css  js  c++  java
  • 在Spring Cloud中配置Feign的拦截器 增加自定义的请求信息进去 以及演示加入Authorization到请求Headers

    Feign是一个很优雅的REST客户端,在Spring Cloud中我们可以像使用本地Service bean一样使用FeignClient,这样的好处是代码更加简单优雅 通俗易懂。

    但是也有不好的,我们不太方便加入自己的元素进去,似乎Feign将很多东西封装好了,我们按照那个套路写就完事了,但有些情况下,不得不改装一下了。

    有很多Spring Cloud微服务使用的是OAuth2认证方式,加入认证之后,微服务之间调用也需要认证,这样光简单请求就连不通了。先想个问题,微服务之间可否有很简单高效的方法去认证?

    一般情况下,一个微服务调用另一个微服务的时候,肯定会伴随一个客户端请求,客户端请求微服务A,微服务A调用微服务B,很少有A无缘无故去调用B。我们假设微服务A B都有OAuth2认证,那么他们的ResourceId肯定是同一个,因为都是一个项目,并且客户端在请求A的时候,肯定是先拿到了access token,才能请求进来的。所以,我们在A call B的时候,可以直接将access token进行传递,直接用客户端发送过来的access token 放到请求Headers中去请求B,这样就能连通了。那么如何在不改变现有Feign的结构的情况下设置这个access token呢?看下面:

    第一步:加入一个配置类,实现Feign的RequestInterceptor,有一个apply方法,可以在这个方法里面去DIY request template,可以加参数,加headers, 改body 改url都行。

    @Configuration
    public class FeignOAuth2RequestInterceptor implements RequestInterceptor {
        @Override
        public void apply(RequestTemplate requestTemplate) {
            HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
            String accessToken = request == null ? StringUtils.EMPTY : request.getHeader(HttpHeaders.AUTHORIZATION);
            System.out.println("=================Feign Interceptor AccessToken: " + accessToken);
            requestTemplate.header(HttpHeaders.AUTHORIZATION, accessToken);
        }
    }

    第二步: 在FeignClient 里面引入第一步的配置

    @FeignClient(name = "test", configuration = FeignOAuth2RequestInterceptor.class)
    public interface MailService {
    
        @RequestMapping(value = "/api/email/v1/sendmail", method = RequestMethod.POST)
        SimpleMailResponse sendMail(@RequestBody MailVO mailVO);
    }
    

    好了,启动Spring Cloud项目再试试

  • 相关阅读:
    C# 使用DateTime.TryParseExact将自定义日期类型转换成日期
    ASP.NET WebServices 因 URL 意外地以“/HelloWorld”结束,请求格式无法识别。
    [UE4]计算2点坐标附近的坐标:线性插值法
    [UE4]Selector和Sequence的区别
    [UE4]蒙太奇动画运行时不播放,预览是好的
    [UE4]蓝图函数库小结
    [UE4]C++调用蓝图函数:BlueprintImplementableEvent函数说明符用法
    [UE4GamePlay架构(九)GameInstance(转)
    [UE4]C++取得蓝图控件实例
    [UE4]虚幻4的智能指针
  • 原文地址:https://www.cnblogs.com/cnsec/p/13407142.html
Copyright © 2011-2022 走看看