广告
返回顶部
首页 > 资讯 > 后端开发 > Python >使用Feign设置Token鉴权调用接口
  • 634
分享到

使用Feign设置Token鉴权调用接口

2024-04-02 19:04:59 634人浏览 泡泡鱼

Python 官方文档:入门教程 => 点击学习

摘要

目录Feign设置Token鉴权调用接口声明FeignClient 指定url调用测试返回对象可以封装demo先去implements RequestInterceptor 重写ap

Feign设置Token鉴权调用接口

声明FeignClient 指定url


@FeignClient(name = "testService", url = "Http://xxxxxx:8088")
public interface FeignTest {
    
    @PostMapping(value = "/xxxxx/sys/login")
    String login(Map<String, Object> map);
}

调用测试


@RestController
public class Test {
    @Autowired
    FeignTest feignTest;
    @Autowired
    MetaDataService metaDataService;
    @PostMapping("/test")
    public void test() {
        HashMap<String, Object> map = new HashMap<>();
        map.put("user_id", "xxx");
        map.put("passWord", "xxxxx");
        //调用 T 具体对象具体封装 
        MetaDataResponseVO<T> login = feignTest.login(map);
        List<T> data = login.getData();
        System.out.println(login.getData());
        //处理业务data
    }
}

返回对象可以封装demo

@Data
public class MetaDataResponseVO<T> implements Serializable {
    private static final long serialVersionUID = 316492198399615153L;
    
    private String retcode;
    
    private String retmsg;
    
    private List<T> data;
}

设置token 进行调用,Feign 的请求拦截器来统一添加请求头信息

先去implements RequestInterceptor 重写apply方法


@Component
public class MetaDataFeignConfig implements RequestInterceptor {
     public FeignBasicAuthRequestInterceptor() {
    }
    
    @Override
    public void apply(RequestTemplate template) {
        //feign加请求头 自定义fangjia.auth.token"
        template.header("access_token", System.getProperty("fangjia.auth.token"));
    }
}

配置拦截器

拦截器需要在 Feign 的配置中定义,代码如下所示。

@Configuration
public class FeignConfiguration {
    
    @Bean
    Logger.Level feignLoggerLevel() {
        return Logger.Level.FULL;
    }
    
    @Bean
    public FeignBasicAuthRequestInterceptor basicAuthRequestInterceptor() {
        return new FeignBasicAuthRequestInterceptor();
    }
}

上面的准备好之后,我们只需要在调用业务接口之前先调用认证接口,然后将获取到的 Token 设置到环境变量中,通过 System.setProperty(“fangjia.auth.token”,token) 设置值,可以使用Redis存放避免每次调用。

    @Value("${feign-client.meta-data.user}")
    private String userId;
    @Value("${feign-client.meta-data.password}")
    private String password;
    private static final String METADATA_ACCESS_TOKEN = "metaDataAccessToken";
    
    public void signInMetaData() {
        //拿缓存
        String accessToken = redisUtils.get(METADATA_ACCESS_TOKEN);
        log.warn("-----------从redis拿meta的token结果--token ={}-------------", accessToken);
        //System.setProperty("fangjia.metadata.token",token) 设置token值
        System.setProperty("feign.metadata.token", accessToken);
        log.warn("--------------设置metaData接口鉴权结束-----------------");
    }

token设置完成,我们需要在我们其他的feign文件中配置这个token,

注意配置对应的拦截器configuration ,MetaDataFeignConfig.class这个类就是我们设置头信息的

@FeignClient(name = “metaDataClient”, url = “${feign-client.meta-data.url}”, configuration = MetaDataFeignConfig.class)
package com.infinitus.dmm.openapi;

@FeignClient(name = "metaDataClient", url = "${feign-client.meta-data.url}", configuration = MetaDataFeignConfig.class)
public interface MetaDataClient {
    
    @RequestMapping(value = "/sc/mtdsystemlist", method = RequestMethod.GET)
    MetaDataResponseVO<MetaDataSystem> pullPhysicalSystemList();

我们在调用该业务接口时候,需要先去调用设置头信息feign,在调用业务feign。

 
    public List<MetaDataSystem> pullPhysicalSystem() {
        //鉴权feign
        signInMetaData();
        //业务feign
        MetaDataResponseVO<MetaDataSystem> responseVO = metaDataClient.pullPhysicalSystemList();
        if (Objects.nonNull(responseVO)) {
            List<MetaDataSystem> data = responseVO.getData();
            if (Objects.nonNull(data) && !data.isEmpty()) {
                return data;
            }
        }
        return new ArrayList<>();
    }

补充

经过测试 鉴权接口调用成功,但是业务接口返回竟然超过10s feign默认的返回1秒就会触发熔断机制,所以我们需要设置feign的超时时间,可以指定FeignClient 名name 很人性化。

@FeignClient(name = “metaDataClient”, url = “${feign-client.meta-data.url}”)
#给metaDataClient服务设置超时时间 这里metaDataClient是我自己,全局的话metaDataClient替换default
feign:
  client:
    config:
      metaDataClient:
        connect-timeout: 50000
        read-timeout: 50000
  hystrix:
    enabled: false

Feign调用进行Token鉴权

项目场景

这边使用 两个SpringBoot应用,中间通过feign来进行远程调用(是的没错,架构就是这么奇葩)。然后在调用feign的时候,希望可以进行token鉴权。

解决办法

请求进来时,通过拦截器,校验header的token,然后在业务中调用feignClient时,通过新加一个feign拦截器,拦截feign请求,把当前的header中的token添加到feign的请求头中去。实现token在链路中的传递。

具体实现

新增 feign 拦截器配置


@Configuration
public class FeignInterceptorConfig implements RequestInterceptor {
    public FeignInterceptorConfig() {}
    @Override
    public void apply(RequestTemplate template) {
        ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
        httpservletRequest request = attributes.getRequest();
        //设置token到请求头
        template.header(ConstantCommon.HEADER_TOKEN_KEY, request.getHeader(ConstantCommon.HEADER_TOKEN_KEY));
    }
}

然后在feignClient接口中,添加 == configuration = FeignInterceptorConfig.class==

注意有Bug!!!

注意!!!,这里会有个异常,获取到的request会是null。原因是hytrix隔离策略是thread,无法读到 threadLocal变量。

解决办法!!更改策略

在配置文件中新增如下配置,即可解决!

# 更换hystrix策略,解决无法传递threadLocal变量问题
hystrix:
    command:
        default:
            execution:
                isolation:
                    strategy: SEMAPHORE

以上为个人经验,希望能给大家一个参考,也希望大家多多支持编程网。

--结束END--

本文标题: 使用Feign设置Token鉴权调用接口

本文链接: https://www.lsjlt.com/news/142467.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 使用Feign设置Token鉴权调用接口
    目录Feign设置Token鉴权调用接口声明FeignClient 指定url调用测试返回对象可以封装demo先去implements RequestInterceptor 重写ap...
    99+
    2022-11-13
  • 使用Feign调用第三方http接口
    目录Feign调用第三方http接口下面就来演示一下原生Feign调用第三方接口引入依赖写接口使用深入理解Feign调用第三方http接口 我们平常在开发的时候,经常会碰到调用第三方...
    99+
    2022-11-13
  • SpringBoot使用Feign调用其他服务接口
    使用SpringCloud的Feign组件能够为服务间的调用节省编码时间并提高开发效率,当服务本身不复杂时可以单独将该组件拿出使用。 引入依赖 <!-- https://...
    99+
    2022-11-11
  • 如何使用Feign调用第三方http接口
    本篇内容介绍了“如何使用Feign调用第三方http接口”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!Feign调用第三方http接口我们平...
    99+
    2023-06-29
  • 如何在SpringBoot中使用Spring-AOP实现接口鉴权
    目录面向切面编程AOP的底层原理实现AOP的相关术语相关注解以及切入点表达式实现接口鉴权1. 配置yml文件2. 读取账密配置3.编写接口鉴权方法4. 编写AOP5.编写接口测试面向...
    99+
    2022-11-13
  • springboot单独使用feign简化接口调用方式
    目录单独使用feign简化接口调用1.引入maven2.启动类添加@EnableFeignClients注解3.像平常一样写一个service接口4.调用接口springbootfe...
    99+
    2022-11-13
  • springboot如何单独使用feign简化接口调用
    这篇文章主要介绍了springboot如何单独使用feign简化接口调用,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。单独使用feign简化接口调用与HttpClient和R...
    99+
    2023-06-29
  • Feign 集成 Hystrix实现不同的调用接口不同的设置方式
    问题描述 小编在写项目时遇到一个需求: 假设现在有三个项目A、B、C,其中A、B作为服务提供方,C作为调用方,需要实现C在调用A、B时实现不同的超时时间,比如C调用A时超时是2s,调...
    99+
    2022-11-12
  • feign调用实现url和接口路径的动态配置化
    做接口开发请求第三方服务的接口,大概率会用feign做请求,而feign也是最常用的一种rpc框架; 这里主要是说明在进行feign请求的时候,第三方服务的url和接口也是可以通过读取配置文件的配置,来进行请求的; 至于为什么要把接口和ur...
    99+
    2023-09-06
    java 后端
  • springboot中shiro使用自定义注解屏蔽接口鉴权实现
    目录传统做法使用自定义注解屏蔽接口鉴权拓展内容:关于spring中的派生注解传统做法 spring boot整合shiro后,如果某些接口需要屏蔽鉴权的话(比如登录)接口,我们一般会...
    99+
    2022-11-13
  • 使用feign调用接口时调不到get方法的问题及解决
    目录feign调用接口调不到get方法feign调用拿不到数据feign调用接口调不到get方法 记录今天在使用springcloud的feign调用接口时踩的坑。 调用的方法是ge...
    99+
    2022-11-13
  • java怎么设置接口调用超时时间
    在 Java 中,我们可以使用 `java.net.URLConnection` 或 `java.net.HttpURLConnec...
    99+
    2023-10-26
    java
  • 设置接口调用超时时间的N种办法
    设置接口调用超时时间的N种办法 最近遇到调用ldap包接口需要设置接口超时时间,于是略微总结了一下java接口调用设置超时时间的方法: 1.在配置文件application.properties...
    99+
    2023-09-03
    java spring 开发语言
  • 云服务器调用本地摄像头怎么设置权限管理端口
    如果您的云服务器上没有本地摄像头,您可以使用以下步骤来设置权限管理端口: 打开控制面板,选择“用户和计算机”—“权限”选项。 选择“允许或拒绝访问我的文件”。 点击下拉菜单中的“高级”或“网络访问”,选择“允许来自我的其他位置的请求”或...
    99+
    2023-10-27
    端口 摄像头 权限
  • 云服务器调用本地打印机怎么设置端口连接
    如果您需要在云服务器上调用本地打印机,可以使用以下步骤来设置端口连接: 在开始菜单中单击“运行”选项,然后单击“命令提示符”。 键入以下命令: open -port 8080 open -port 2144 send -port 21...
    99+
    2023-10-26
    端口 打印机 服务器
  • 云服务器调用本地打印机怎么设置端口连接方式
    如果您需要在云服务器上调用本地打印机,可以在云服务器上设置端口连接方式。以下是云服务器上设置端口连接方式的步骤: 首先确保云服务器支持IP地址、子网掩码、域名等网络地址。在云服务器上,可以通过以下命令来配置IP地址: ``` ping...
    99+
    2023-10-27
    端口 打印机 方式
  • 云服务器调用本地打印机怎么设置端口连接不上
    如果您无法通过云服务器连接到打印机,可能是因为云服务器的端口设置不正确或者云服务器正在维护或者网络连接有问题。以下是一些常见的情况下,云服务器使用本地打印机时可能会发生的问题的解决方案: 检查网络连接:检查云服务器和本地网络的连接状态,...
    99+
    2023-10-27
    端口 打印机 连接不上
  • 腾讯云服务器怎么使用登录方式设置权限管理端口
    一、使用Python的requests库发送HTTP请求 使用requests库发送HTTP请求的步骤如下: 在Python中导入requests库 python import requests 创建一个URL对象 python...
    99+
    2023-10-28
    腾讯 端口 权限
  • 腾讯云服务器如何使用登录方式设置权限管理端口
    首先,在腾讯云服务器上选择登录方式,可以选择使用Web浏览器登录或使用APP登录。如果使用Web浏览器登录,需要输入用户名和密码进行登录,如果使用APP登录,需要下载和安装腾讯云服务器应用程序,并且需要使用应用程序提供的权限管理功能。 在...
    99+
    2023-10-27
    腾讯 如何使用 端口
  • 腾讯云服务器如何使用登录方式设置端口连接服务器
    首先,在服务器的管理后台中选择要连接的服务器IP地址,并获取服务器的端口列表。 其次,在服务器上创建一个新的服务,并将端口号设置为服务所对应的端口。例如,在腾讯云服务器上,如果你想连接的服务器IP地址是10.0.0.1,端口号是3389,...
    99+
    2023-10-28
    服务器 腾讯 如何使用
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作