基于Oauth2.0的OpenFeign远程调用

目录

前言

   1.引入openfeign相关依赖

2.开启openFeign远程调用,在启动类头加上注解即可

3. 提供远程调用接口,接口名称必须与controler名称保持一致

4.远程调用关键代码

        4.1 注入restTemplate

        4.2  配置拦截器

        4.3 设置请求头

        4.4 获取请求结果

        4.5 远程调用的完整代码:

 5.实现效果


前言

        因为其他各个服务都做了授权认证,如果不带Authorization,或者无效的请求头Authorization,都无法通过验证,即请求接口失败。

   1.引入openfeign相关依赖

        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-openfeign</artifactId>
            <version>3.0.0</version>
        </dependency>
        <

2.开启openFeign远程调用,在启动类头加上注解即可

3. 提供远程调用接口,接口名称必须与controler名称保持一致

4.远程调用关键代码

        4.1 注入restTemplate

package com.example.mq.config;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.example.common.interpretor.AuthorizationHeaderInterceptor;
import com.example.securityservice.config.ResourceServerConfig;
import com.example.securityservice.config.TokenConfig;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.HttpEntity;
import org.springframework.http.HttpHeaders;
import org.springframework.http.MediaType;
import org.springframework.util.LinkedMultiValueMap;
import org.springframework.util.MultiValueMap;
import org.springframework.web.client.RestTemplate;

/**
 * 通过扫描包的方式注入注解,降低代码的耦合度
 */
@ComponentScan(basePackages = "com.example.securityservice.config")
@Configuration
public class LoadAuthorizationConfig {
    private Logger  logger = LoggerFactory.getLogger(LoadAuthorizationConfig.class);

    @Bean
    public RestTemplate restTemplate(){
        RestTemplate restTemplate = new RestTemplate();
        return  restTemplate;
    }

}

        4.2  配置拦截器

                在远程调用的请求头加入 Authorization请求头,降低代码的重复率。

package com.example.mq.interpretor;

import org.springframework.http.HttpRequest;
import org.springframework.http.client.ClientHttpRequestExecution;
import org.springframework.http.client.ClientHttpRequestInterceptor;
import org.springframework.http.client.ClientHttpResponse;

import java.io.IOException;

/**
 * 请求拦截器,在restTemplate请求中自动加入token
 */

public class AuthorizationHeaderInterceptor implements ClientHttpRequestInterceptor {
    private final String token;

    public AuthorizationHeaderInterceptor(String token) {
        this.token = token;
    }

    @Override
    public ClientHttpResponse intercept(HttpRequest request, byte[] body, ClientHttpRequestExecution execution) throws IOException {
        // 添加Authorization头
        request.getHeaders().add("Authorization", "Bearer " + this.token);
        // 如果需要,还可以添加其他请求头
        // request.getHeaders().add("Another-Header", "HeaderValue");
        return execution.execute(request, body);
    }
}

        4.3 设置请求头

public void  setHeaderToken(){
        // 创建MultiValueMap来存储表单数据
        MultiValueMap<String, String> formData = new LinkedMultiValueMap<>();
        formData.add("client_id", CLIENT_ID);
        formData.add("client_secret", CLIENT_SECRET);
        formData.add("grant_type", GRANT_TYPE);
        // 设置请求头,指明内容类型为application/x-www-form-urlencoded
        HttpHeaders headers = new HttpHeaders();
        headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED);
        // 创建HttpEntity,它包装了表单数据和请求头
        HttpEntity<MultiValueMap<String, String>> requestEntity = new HttpEntity<>(formData, headers);
        // 发送POST请求
        Object response = restTemplate.postForObject(TOKEN_REQUEST_URL, requestEntity, Object.class);
        JSONObject jsonObject = JSON.parseObject(JSONObject.toJSONString(response));
        String  access_token  = jsonObject.getString("access_token");
        // 创建拦截器
        AuthorizationHeaderInterceptor interceptor = new AuthorizationHeaderInterceptor(access_token);
        // 将拦截器添加到RestTemplate
        restTemplate.getInterceptors().add(interceptor);
    }

        4.4 获取请求结果

  public   Object getReqRes(String path){
       ServiceInstance services= discoveryClient.getInstances("consumer-service").get(0);
       String host  = services.getHost();
       int port = services.getPort();
       StringBuffer  reqUrl =  new StringBuffer();
       reqUrl.append("http://");
       reqUrl.append(host);
       reqUrl.append(":"+port);
       String res  = restTemplate.getForObject(reqUrl.toString()+path,String.class);
       return res;
   }

        4.5 远程调用的完整代码:

package com.example.mq.controller;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.example.common.interpretor.AuthorizationHeaderInterceptor;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.client.ServiceInstance;
import org.springframework.cloud.client.discovery.DiscoveryClient;
import org.springframework.http.HttpEntity;
import org.springframework.http.HttpHeaders;
import org.springframework.http.MediaType;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.util.LinkedMultiValueMap;
import org.springframework.util.MultiValueMap;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;

@RestController
@RequestMapping("/mq")
public class MqController {
    @Autowired
    private RestTemplate restTemplate;
    private final  static  String CLIENT_ID ="admin";
    private final  static  String CLIENT_SECRET ="123456";
    private final  static  String GRANT_TYPE ="client_credentials";
    private final  static  String TOKEN_REQUEST_URL ="http://localhost:8063/oauth/token";
    private final  static  String URL ="http://localhost:8063";
    private Logger logger = LoggerFactory.getLogger(MqController.class);
    @Autowired
    private DiscoveryClient discoveryClient;
    @GetMapping("/qq")
    public String mq(){
        //设置请求头
        setHeaderToken();
        //发起请求
        Object reqUrl = getReqRes("/consumer");
        logger.info("请求结果:{}",JSON.toJSONString(reqUrl));
        return "mq";
    }
    @PreAuthorize("hasAuthority('system:dept:list')")
    @GetMapping("/mm")
    public String mm(){
        return "mm";
    }

    public void  setHeaderToken(){
        // 创建MultiValueMap来存储表单数据
        MultiValueMap<String, String> formData = new LinkedMultiValueMap<>();
        formData.add("client_id", CLIENT_ID);
        formData.add("client_secret", CLIENT_SECRET);
        formData.add("grant_type", GRANT_TYPE);
        // 设置请求头,指明内容类型为application/x-www-form-urlencoded
        HttpHeaders headers = new HttpHeaders();
        headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED);
        // 创建HttpEntity,它包装了表单数据和请求头
        HttpEntity<MultiValueMap<String, String>> requestEntity = new HttpEntity<>(formData, headers);
        // 发送POST请求
        Object response = restTemplate.postForObject(TOKEN_REQUEST_URL, requestEntity, Object.class);
        JSONObject jsonObject = JSON.parseObject(JSONObject.toJSONString(response));
        String  access_token  = jsonObject.getString("access_token");
        // 创建拦截器
        AuthorizationHeaderInterceptor interceptor = new AuthorizationHeaderInterceptor(access_token);
        // 将拦截器添加到RestTemplate
        restTemplate.getInterceptors().add(interceptor);
    }
   public   Object getReqRes(String path){
       ServiceInstance services= discoveryClient.getInstances("consumer-service").get(0);
       String host  = services.getHost();
       int port = services.getPort();
       StringBuffer  reqUrl =  new StringBuffer();
       reqUrl.append("http://");
       reqUrl.append(host);
       reqUrl.append(":"+port);
       Object res  = restTemplate.getForObject(reqUrl.toString()+path,Object.class);
       return res;
   }


}

 5.实现效果

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/774826.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

两次叛国投敌,没有祸及子孙反而家族长盛不衰的传奇

这个人就是韩国国王韩王信&#xff0c;汉朝八大异姓王之一。 第一次叛国投敌&#xff0c;发生在楚汉争霸时期。有一次他的军队被项羽包围&#xff0c;于是选择了投降。不过&#xff0c;这是权宜之计&#xff0c;不久就借机回到刘邦阵营。 第二次叛国投敌&#xff0c;发生在西…

openssl交叉编译-移植ARM

OpenSSL是一个开源的密码学工具包&#xff0c;提供了一组用于网络安全的加密和解密算法、协议以及相关工具的库&#xff0c;它通过提供多种加密算法、协议和工具&#xff0c;为网络通信和数据存储提供了强大的安全保障。 主要功能 加密和解密&#xff1a; OpenSSL提供了多种对…

字节码编程javassist之结合hotswap在运行期动态修改方法返回值

写在前面 本文看下如何通过javassist结合hotswap在运行期动态修改方法的返回值。 1&#xff1a;代码 要修改的代码 public class ApiTest {public String m1(String info) {return "info is: " info;} }javasssit代码 package com.dahuyou.javassist.huohuo;im…

娱乐圈新瓜《庆余年》二皇子刘端端被曝“深夜秘事”

《庆余年》外&#xff0c;二皇子刘端端的“深夜冒险”网友笑称&#xff1a;权谋剧外更有戏话说《庆余年》里的二皇子李承泽&#xff0c; 那可是权谋与颜值并存的典范&#xff0c;但戏外的刘端端&#xff0c; 最近却成了“深夜冒险家”&#xff0c;让一众吃瓜群众笑中带惊&…

CNN文献综述

卷积神经网络&#xff08;Convolutional Neural Networks&#xff0c;简称CNN&#xff09;是深度学习领域中的一种重要模型&#xff0c;主要用于图像识别和计算机视觉任务。其设计灵感来自于生物学中视觉皮层的工作原理&#xff0c;能够高效地处理图像和语音等数据。 基本原理…

JVM专题之性能优化

运行时优化 方法内联 > 方法内联,是指 **JVM在运行时将调用次数达到一定阈值的方法调用替换为方法体本身** ,从而消除调用成本,并为接下来进一步的代码性能优化提供基础,是JVM的一个重要优化手段之一。 > > **注:** > > * **C++的inline属于编译后内联,…

特殊用途二极管+二极管故障检测+三极管(BJT)的工作原理+定时器的使用(小灯定时闪烁实现)

2024-7-5&#xff0c;星期五&#xff0c;17:27&#xff0c;天气&#xff1a;晴&#xff0c;心情&#xff1a;晴。今天没有什么特殊的事情发生&#xff0c;继续学习啦&#xff0c;加油加油&#xff01;&#xff01;&#xff01; 今日完成模电自选教材第二章内容的学习&#xff…

Linux-C语言实现一个进度条小项目

如何在linux中用C语言写一个项目来实现进度条&#xff1f;&#xff08;如下图所示&#xff09; 我们知道\r是回车&#xff0c;\n是换行&#xff08;且会刷新&#xff09; 我们可以用 \r 将光标移回行首&#xff0c;重新打印一样格式的内容&#xff0c;覆盖旧的内容&#xff0c;…

二重积分 - 包括计算方法和可视化

二重积分 - 包括计算方法和可视化 flyfish 计算在矩形区域 R [ 0 , 1 ] [ 0 , 2 ] R [0, 1] \times [0, 2] R[0,1][0,2] 下&#xff0c;函数 z 8 x 6 y z 8x 6y z8x6y 的二重积分。这相当于计算曲面 z 8 x 6 y z 8x 6y z8x6y 与 xy 平面之间的体积。 二重积分…

网页计算器的实现

简介 该项目实现了一个功能完备、交互友好的网页计算器应用。只使用了 HTML、CSS 和 JavaScript &#xff0c;用于检验web前端基础水平。 开发环境&#xff1a;Visual Studio Code开发工具&#xff1a;HTML5、CSS3、JavaScript实现效果 功能设计和模块划分 显示模块&#…

Chapter11让画面动起来——Shader入门精要学习笔记

Chapter11让画面动起来 一、Unity Shader中的内置变量&#xff08;时间篇&#xff09;二、纹理动画1.序列帧动画2.滚动背景 三、顶点动画1.流动的河流2.广告牌3.注意事项①批处理问题②阴影投射问题 一、Unity Shader中的内置变量&#xff08;时间篇&#xff09; Unity Shader…

Chiasmodon:一款针对域名安全的公开资源情报OSINT工具

关于Chiasmodon Chiasmodon是一款针对域名安全的公开资源情报OSINT工具&#xff0c;该工具可以帮助广大研究人员从各种来源收集目标域名的相关信息&#xff0c;并根据域名、Google Play应用程序、电子邮件地址、IP地址、组织和URL等信息进行有针对性的数据收集。 该工具可以提…

window系统openssl开发环境搭建(VS2017)

window系统openssl开发环境搭建 VS2017 一、下载openssl二、安装openssl三、openssl项目配置3.1 配置include文件3.2 配置openssl动态库四、编写openssl测试代码五、问题总结5.1 问题 一5.2 问题二一、下载openssl https://slproweb.com/products/Win32OpenSSL.html 根据自己…

如何查看MCU编译生成的elf(out)文件内容

一般地&#xff0c;我们想要知道单片机程序编译完后的结构我们可以查看map文件或者是elf/out文件&#xff0c;map文件不能看函数的汇编格式&#xff0c;只能查看编译完成后变量、代码的地址和占用空间大小&#xff0c;而elf文件里面更加详细&#xff0c;还包含了函数的汇编&…

CobaltStrike的内网安全

1.上线机器的Beacon的常用命令 2.信息收集和网站克隆 3.钓鱼邮件 4.CS传递会话到MSF 5.MSF会话传递到CS 1上线机器的Beacon的常用命令 介绍&#xff1a;CobaltStrike分为服务端和客户端&#xff0c;一般我们将服务端放在kali&#xff0c;客户端可以在物理机上面&#xff0…

跨境人最怕的封店要怎么规避?

跨境人最怕的是什么&#xff1f;——封店 造成封店的原因很多&#xff0c;IP关联、无版权售卖、虚假发货等等&#xff0c;其中IP关联这个问题导致店铺被封在跨境商家中简直是屡见不鲜 IP关联&#xff0c;是指被海外平台检测到多家店铺开设在同一个站点上的情况。我们知道有些…

您的私人办公室!-----ONLYOFFICE8.1版本的桌面编辑器测评

随时随地创建并编辑文档&#xff0c;还可就其进行协作 ONLYOFFICE 文档是一款强大的在线编辑器&#xff0c;为您使用的平台提供文本文档、电子表格、演示文稿、表单和 PDF 编辑工具。 网页地址链接&#xff1a; https://www.onlyoffice.com/zh/office-suite.aspxhttps://www…

“拆分盘投资:机遇与风险并存

一、引言 随着互联网技术的日新月异&#xff0c;金融投资领域迎来了前所未有的变革&#xff0c;其中拆分盘作为一种新兴的投资模式&#xff0c;正逐渐进入公众的视野。其独特的价值增长逻辑和创新的投资机制&#xff0c;为投资者开辟了新的财富增值渠道。本文旨在深入探讨拆分…

tinyshop商城学习

1、使用badboy屏幕录制工具&#xff0c;获得服装购物业务的结果&#xff0c;生成.jmx文件 2、在JMeter中新建线程组&#xff0c;导入.jmx文件 3、完成进入商城&#xff0c;登录&#xff0c;服装页面进入&#xff0c;随机选择服装&#xff0c;添加购物车&#xff0c;开始结算&…

WAIC上官宣!大模型语料提取工具MinerU正式发布,开源免费“敲”好用

7月4日&#xff0c;2024 WAIC科学前沿全体会议在上海世博中心红厅隆重举行。上海人工智能实验室与商汤科技联合香港中文大学和复旦大学正式发布新一代大语言模型书⽣浦语2.5&#xff08;InternLM2.5&#xff09;&#xff0c;同时全链条工具体系迎来重磅升级&#xff0c;对于大模…