基于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);@Beanpublic 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;}@Overridepublic 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-urlencodedHttpHeaders 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);// 将拦截器添加到RestTemplaterestTemplate.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 {@Autowiredprivate 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);@Autowiredprivate 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-urlencodedHttpHeaders 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);// 将拦截器添加到RestTemplaterestTemplate.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.rhkb.cn/news/369382.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Hadoop3:Yarn的Tool接口案例

一、需求 依然以wordcount案例为基础&#xff0c;进行开发 我们知道&#xff0c;用hadoop自带的example.jar执行wordcount 命令如下 hadoop jar /opt/module/hadoop-3.1.3/share/hadoop/mapreduce/hadoop-mapreduce-examples-3.1.3.jar wordcount -D mapreduce.job.queuename…

vue3 滚动条滑动到元素位置时,元素加载

水个文 效果 要实现的思路就是&#xff0c;使用IntersectionObserver 检测元素是否在视口中显示&#xff0c;然后在通过css来进行动画载入。 1.监控元素是否视口中显示 const observer new IntersectionObserver((entries) > {entries.forEach((entry) > {if (entry.i…

【C++】认识使用string类

【C】STL中的string类 C语言中的字符串标准库中的string类string类成员变量string类的常用接口说明成员函数string(constructor构造函数)~string(destructor析构函数)默认赋值运算符重载函数 遍历string下标[ ]迭代器范围for反向迭代器 capacitysizelengthmax_sizeresizecapaci…

Windows Server 2019部署网络负载均衡NLB服务的详细操作步骤

部署前准备 首先需要准备两台Windows Server 2019服务器&#xff0c;虚拟机创建请参考 VMware Workstation安装Windows Server2019系统详细操作步骤_安装windows server 2019操作系统(写出操作过程)-CSDN博客 克隆虚拟机请参考 VMware Workstation克隆虚拟机详细步骤-CSDN博…

滤波算法学习笔记

目录 引言 一、定义 二、分类 三、常见滤波算法 四、应用与优势 五、发展趋势 例程 1. 均值滤波&#xff08;Moving Average Filter&#xff09; 2. 中值滤波&#xff08;Median Filter&#xff09; 3. 高斯滤波&#xff08;Gaussian Filter&#xff09; 4.指数移动…

Redis组建哨兵模式

主172.17.60.131 从172.17.60.130、172.17.60.129 redis部署 [rootlocalhost app]# tar xf redis-6.2.9.tar.gz [rootlocalhost app]# cd redis-6.2.9/ [rootlocalhost redis-6.2.9]# make MALLOClibc [rootlocalhost redis-6.2.9]# make install PREFIX/usr/local/redis…

换根dp,CF 633F - The Chocolate Spree

一、题目 1、题目描述 2、输入输出 2.1输入 2.2输出 3、原题链接 633F - The Chocolate Spree 二、解题报告 1、思路分析 2600的题&#xff0c;但是不算很困难。 先考虑暴力做法&#xff0c;如何得到两条不相交的路径&#xff1f; 枚举删除的边&#xff0c;得到两棵子树…

数据结构_线性表

线性表的定义和特点 线性表是具有相同特性的数据元素的一个有限序列 :线性起点/起始节点 :的直接前驱 :的直接后继 :线性终点/终端节点 n:元素总个数,表长 下标:是元素的序号,表示元素在表中的位置 n0时称为空表 线性表 由n(n>0)个数据元素(结点),组成的有限序列 将…

jenkins在使用pipeline时,为何没有方块形视图

项目场景&#xff1a; 安装完Jenkins时后&#xff0c;通过pipeline创建的项目任务。 问题描述 在立即构建后&#xff0c;没有显示每个阶段的视图。 原因分析&#xff1a; 原因是&#xff0c;刚安装的Jenkins&#xff0c;这个视图不是Jenkins自带的功能&#xff0c;而必须安装…

【计算机网络基础知识】

首先举一个生活化的例子&#xff0c;当你和朋友打电话时&#xff0c;你可能会使用三次握手和四次挥手的过程进行类比&#xff1a; 三次握手&#xff08;Three-Way Handshake&#xff09;&#xff1a; 你打电话给朋友&#xff1a;你首先拨打你朋友的电话号码并等待他接听。这就…

Selenium IDE 的使用指南

Selenium IDE 的使用指南 在自动化测试的领域中&#xff0c;Selenium 是一个广为人知且强大的工具集。而 Selenium IDE 作为其中的一个组件&#xff0c;为测试人员提供了一种便捷且直观的方式来创建和执行自动化测试脚本。 一、Selenium IDE 简介 Selenium IDE 是一个用于录…

二、从多臂老虎机看强化学习

二、从多臂老虎机看强化学习 2.1 多臂老虎机问题2.1.1 问题定义2.2.2 问题建模2.2.3 累积懊悔2.2.4 估计期望奖励 2.2 强化学习中的探索与利用平衡2.3 贪心策略2.4 上置信界算法2.5 汤普森采样算法 2.1 多臂老虎机问题 2.1.1 问题定义 在多臂老虎机(mutil-armed bandit, MAB)问…

深度神经网络语言识别

「AI秘籍」系列课程&#xff1a; 人工智能应用数学基础人工智能Python基础人工智能基础核心知识人工智能BI核心知识人工智能CV核心知识 使用 DNN 和字符 n-gram 对一段文本的语言进行分类&#xff08;附 Python 代码&#xff09; 资料来源&#xff0c;flaticon&#xff1a;htt…

开发一套java语言的智能导诊需要什么技术?java+ springboot+ mysql+ IDEA互联网智能3D导诊系统源码

开发一套java语言的智能导诊需要什么技术&#xff1f;java springboot mysql IDEA互联网智能3D导诊系统源码 医院导诊系统是一种基于互联网和3D人体的智能化服务系统&#xff0c;旨在为患者提供精准、便捷的医院就诊咨询服务。该系统整合了医院的各种医疗服务资&#xff1b;智慧…

20.【C语言】初识结构体(重要)

定义&#xff1a;由一批数据组合而成的结构型数据 作用&#xff1a;描述复杂对象&#xff0c;创建新的类型 格式&#xff1a; struct 对象 { …… } 介绍. 用法&#xff1a;结构体变量.成员变量 #define _CRT_SECURE_NO_WARNINGS 1 #include <stdio.h> struct hotal…

nuxt、vue树形图d3.js

直接上代码 //安装 npm i d3 --save<template><div class"d3"><div :id"id" class"d3-content"></div></div> </template> <script> import * as d3 from "d3";export default {props: {d…

Facebook广告被拒:常见原因以及避免屏蔽的方法

大多数情况下&#xff0c;广告被屏蔽是因为违反了规则&#xff0c;这不仅仅是因为审核因素。有些规则并不明显&#xff0c;也没有在任何地方指定。例如&#xff0c;在广告中使用广告政策中未列出的停用词&#xff1b;审核算法确定照片描绘的模特过于暴露。下面小编将为你介绍Fa…

NET程序开发可能会用到的一些资料文档

NET程序开发使用的一些资料文件&#xff0c;NET高级调试&#xff0c;NET关键技术深入解析&#xff0c;WPF专业编程指南&#xff0c;程序员求职攻略&#xff0c;WPF编程宝典等。 下载链接&#xff1a;https://download.csdn.net/download/qq_43307934/89518582

【微信小程序开发实战项目】——如何制作一个属于自己的花店微信小程序(1)

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;开发者-曼亿点 &#x1f468;‍&#x1f4bb; hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍&#x1f4bb; 本文由 曼亿点 原创 &#x1f468;‍&#x1f4bb; 收录于专栏&#xff1a…

带安全启动—Ubuntu系统—手动安装Nvidia驱动

教程1&#xff1a;在启用安全启动的 Fedora 中安装英伟达驱动 教程2&#xff1a;UEFI安全启动模式下安装Ubuntu的NVIDIA显卡驱动 1. 搜索合适的驱动 Nvidia驱动官网 选择这个 驱动(.run)链接 2. 安装必要的软件依赖 CUDA底层用C写的&#xff0c;因此导入编译器 sudo apt i…