基于Oauth2.0的OpenFeign远程调用

news2024/11/18 16:36:08

目录

前言

   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.coloradmin.cn/o/1900199.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

鸿蒙笔记导航栏,路由,还有axios

1.导航组件 导航栏位置可以调整&#xff0c;导航栏位置 Entry Component struct t1 {build() {Tabs(){TabContent() {Text(qwer)}.tabBar("首页")TabContent() {Text(发现内容)}.tabBar(发现)TabContent() {Text(我的内容)}.tabBar("我的")}// 做平板适配…

“郭有才”商标主要类别都已被注册!

前阵山东网红“郭有才”火遍大江北&#xff0c;当然少不了许多想去申请注册“郭有才”商标名称的&#xff0c;普推商标知产老杨检索&#xff0c;发现“郭有才”商标申请了43个类别&#xff0c;基本上类别都被申请注册&#xff0c;已注册的商标大多是在“郭有才”火之前申请注册…

Qt 基础组件速学 鼠标和键盘事件

学习目标&#xff1a; 鼠标事件和键盘事件应用 前置环境 运行环境:qt creator 4.12 学习内容和效果演示&#xff1a; 1.鼠标事件 根据鼠标的坐标位置&#xff0c;做出对应的事件。 2.键盘事件 根据键盘的输入做出对应操作 详细主要代码 1.鼠标事件 #include "main…

#商铺出租数据#2024年6月北上广深成渝对比情况

#商铺出租数据#2024年6月北上广深成渝对比情况&#xff1a; 根据某8平台不完全样本统计&#xff0c;北上广深成渝商铺每平米月租金从高到低依次为 北京218.7元、上海212.1元、深圳159.3元、广州145.8元、成都138.6元、重庆104.1元。 地区 区县 日期 类型 数值 上海 全城 202…

开发必备基础知识【字符编码合集】

开发必备基础知识【字符编码合集】 大家在日常开发交流中会发现&#xff0c;别人那里运行的好好的文件&#xff0c;在你电脑上却无法编译&#xff0c;甚至出现一堆莫名其妙的字符&#xff0c;比如&#xff1a;&#xfffd;&#xfffd;&#xfffd; 程序中经常遇到一些关于乱码…

开发笔记:vue3+ts+vant 卡片数据分页,下拉加载,卡片左滑可删除

效果&#xff1a; 实现 使用vantui组件 van-swipe-cell van-card &#xff08;商品卡片&#xff09; 核心代码 const currentPage ref(1) const pageSize ref(4) const totalSize ref(10) const loading ref(false) const finished ref(false) const refreshing ref(…

商务办公优选!AOC Q27E3S2商用显示器,打造卓越新体验!

摘要&#xff1a;助办公室一族纵横职场&#xff0c;实现高效舒适办公&#xff01; 在日常商务办公中&#xff0c;对于办公室一族来说总有太多“难难难难难点”&#xff1a;工作任务繁琐&#xff0c;熬夜加班心力交瘁、长时间伏案工作导致颈椎、眼睛等出现问题&#xff0c;职业…

SQL Server 2022数据库对象

《SQL Server 2022从入门到精通&#xff08;视频教学超值版&#xff09;》图书介绍-CSDN博客 数据库对象是数据库的组成部分&#xff0c;数据表、视图、索引、存储过程以及触发器等都是数据库对象。 &#xff08;1&#xff09;数据库的主要对象是数据表&#xff0c;数据表是一…

基于LabVIEW的设备安装螺栓连接设计

介绍了一种基于LabVIEW的辅助设备安装螺栓连接设计案例。通过LabVIEW软件&#xff0c;实现了从螺栓规格预估、强度校核到物料选用的整个流程的软件化&#xff0c;提高了设计效率和安装可靠性。 项目背景 在轨道车辆设备安装中&#xff0c;螺栓连接作为一种常见的紧固方式&…

MSPM0G3507——读取引脚的高低电平方法(数字信号循迹模块)

SYSCFG配置 代码部分 //第一个传感器if( DL_GPIO_readPins(xunji_PORT_PIN1_PORT , xunji_PORT_PIN1_PIN )xunji_PORT_PIN1_PIN) //黑&#xff0c;不亮 高{a1;}if( DL_GPIO_readPins(xunji_PORT_PIN1_PORT , xunji_PORT…

C++开发调试工具:GDB调试,windebug调试,adb调试

我们在C开发过程中时常避免不了要调试追踪&#xff0c;一下介绍最主流的三种调试工具&#xff1a; 一.GDB调试 1.coredump文件&#xff1a; coredump文件是程序异常时系统产生的错误日志文件&#xff0c;即核心转储文件&#xff1b; 编译一个debug程序&#xff0c;必须是debu…

Appium元素定位(全网详细讲解)(二)

1.appium inspector&#xff08;定位元素的工具&#xff09;使用方法 详细介绍&#xff1a; 详细解释&#xff1a; 图标名称说明1Show Element Handles是否显示元素句柄2Select Elements选择元素定位3Tap/Swipe By Coordinates按坐标点击/滑动4Download Screenshot下载屏幕截…

Nginx-http_auth_basic_module使用

文章目录 前言一、ngx_http_auth_basic_module二、指令1.auth_basic1.auth_basic_user_file 示例生成密码文件配置basic认证浏览器验证 总结 前言 nginx可以通过HTTP Basic Authutication协议进行用户名和密码的认证。 一、ngx_http_auth_basic_module 生效阶段&#xff1a; …

科普文:如何进行有效沟通

概叙 你会沟通吗&#xff1f; 你知道正确的沟通应该怎么做吗&#xff1f; 在日常生活和工作中&#xff0c;不会沟通带来的困扰是否让你感同身受&#xff1f; 在工作中&#xff0c;你是否因表达不清让观点无法被同事理解和采纳&#xff0c;影响职业发展&#xff1f; 与上级交流是…

GuLi商城-商品服务-API-品牌管理-云存储开通与使用

这里学习下阿里云对象存储 地址&#xff1a;对象存储 OSS_云存储服务_企业数据管理_存储-阿里云 登录支付宝账号&#xff0c;找到了我以前开通的阿里云对象存储 熟悉下API 文档中心 简介_对象存储(OSS)-阿里云帮助中心 我们将用这种方式上传阿里云OSS

C++怎么解决不支持字符串枚举?

首先&#xff0c;有两种方法&#xff1a;使用命名空间和字符串常量与使用 enum class 和辅助函数。 表格直观展示 特性使用命名空间和字符串常量使用 enum class 和辅助函数类型安全性低 - 编译器无法检查字符串有效性&#xff0c;运行时发现错误高 - 编译期类型检查&#xf…

爆破片和安全阀

一、爆破片介绍 爆破片是一种用于安全释放压力的结构&#xff0c;通常应用于压力容器、管道和设备中&#xff0c;以防止由于压力过高而导致的灾难性故障。在压力超过设定值时&#xff0c;爆破片会破裂&#xff0c;从而迅速将过压泄放&#xff0c;保护设备和人员安全 爆破片通常…

Java——IO流(二)-(4/7):不同编码读取乱码的问题,转换流-InputStreamReader、OutputStreamWriter

目录 不同编码读取出现乱码的问题 转换流 InputStreamReader(字符输入转换流) 实例演示(1) OutputStreamWriter(字符输出转换流) 实例演示(2) 不同编码读取出现乱码的问题 如果代码编码和被读取的文本文件的编码是一致的&#xff0c;使用字符流读取文本文件时不会出现乱…

达梦数据库系列—22. DPC集群原理

目录 DPC原理 1、系统原理 2、元数据服务 3、数据存储 4、执行计划的生成 5、计算与存储分离 6、动态增删节点 7、分布式事务一致性 第一阶段 预提交 第二阶段 提交 8、RAFT 归档 9、自动故障处理 DPC原理 计划生成节点&#xff08;SP&#xff09;&#xff1a;对外…

猫狗图像分类-划分数据集

&#x1f4da;博客主页&#xff1a;knighthood2001 ✨公众号&#xff1a;认知up吧 &#xff08;目前正在带领大家一起提升认知&#xff0c;感兴趣可以来围观一下&#xff09; &#x1f383;知识星球&#xff1a;【认知up吧|成长|副业】介绍 ❤️如遇文章付费&#xff0c;可先看…