当前位置: 首页 > news >正文

毕设之-Hlang后端架构-双系统交互

文章目录

  • 前言
  • 交互流程
    • 基本流程
    • 约定公钥
    • 人人中台携带公钥获取私钥
    • 私钥生成
    • 人人中台携带私钥访问
    • 私钥验证(博客系统)
  • 调试演示
  • 总结

前言

前天我们完成了基本的整合,但是还没有整合到我们的业务系统,也就是博客系统。本来昨天要搞一手的,但是在练车,所以就没有完成。那么今天补上,差不多20号去上班实习,这点时间赶紧搞完。

首先的话,我们这里建好了业务表:
在这里插入图片描述
并且我们创建好了新的服务:
在这里插入图片描述

并且,我们通过人人开源生成好了对应的后端的一个CURD和基本接口。

然后,我们把对应的controller,和feign接口做好对接。

如图:(整合好的feign组件)
在这里插入图片描述

然后在我们的人人开源中台系统做好调用
在这里插入图片描述
这里的话,我们可以发现是这样的流程
在这里插入图片描述

之后的话,在我们的博客系统当中我们有这个:
在这里插入图片描述

交互流程

那么这里,我们今天要实现的就是在人人开源中台系统过来调用到我们的具体服务的api的时候要做到的一个权限验证

因为我们这是两个系统,没有共同使用一个用户表,这也就是意味着,我们一个权限不方便公用一个。所以对应的一些服务得像第三方api一样提供。只不过这个api接口,可以通过注册中心知道,然后可以由open-feign调用而已。

基本流程

okey,那么在这里的话,我们先简单梳理一下,我们的基本流程:
在这里插入图片描述
那么在这里,我们可以解读到这几个信息:

  1. 需要一个公钥接口,拿到公钥
  2. 需要一个申请临时密钥的接口,通过这个密钥去访问服务

那么在人人中台要做:

  1. 先拿到公钥
  2. 通过公钥拿到私钥
  3. 携带私钥去访问

对于博客系统:

  1. 开发公钥接口
  2. 开发私钥接口
  3. 对受保护接口进行私钥验证

同时,由于公钥接口是公开的,得到的公钥在一定时间是一致的,因此我们可以直接做个约定,公钥是啥,也就是可以学一下rouyi,这个写死省下一个接口

所以这里的话,我们在编码阶段,我可以这样干。

约定公钥

我们先约定公钥。
我们可以看到,在我们的博客系统当中的话,有个获取私钥的接口:
在这里插入图片描述
这里的话,我们写死了,就是直接指定公钥是HUTEROX。

人人中台携带公钥获取私钥

然后就是人人中台携带公钥获取私钥
在这里插入图片描述
这里的话,我们在feign的拦截器当中实现了这个功能。我们先拿到私钥。

私钥生成

那么这个时候,我们自然就要生成私钥了,这个私钥由我们的博客系统生成。
在这里插入图片描述

package com.huterox.hlangserver.controller.innocontroller.auto;import com.huterox.common.utils.R;/*** 负责实现对内部服务调用的一个API授权签发* */
public interface AutoInnoApiService {/*** 签发临时授权码* */R SignApiAutoCode();/*** 验证签发的授权码是否通过* */boolean AcceptApiAutoCode(String signKey,String signal);
}

之后的话就是我们具体的实现类了。

package com.huterox.hlangserver.controller.innocontroller.auto.impl;
import com.alibaba.fastjson.JSON;
import com.huterox.common.sysEntity.SignApiCode;
import com.huterox.common.utils.CodeUtils;
import com.huterox.common.utils.R;
import com.huterox.hlangserver.controller.innocontroller.auto.AutoInnoApiService;
import com.huterox.hlangserver.utils.RedisTransKey;
import com.huterox.hlangserver.utils.RedisUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.concurrent.TimeUnit;@Service
public class BaseAutoInnoApiServiceImpl implements AutoInnoApiService {private RedisUtils redisUtils;public BaseAutoInnoApiServiceImpl(RedisUtils redisUtils) {this.redisUtils = redisUtils;}@Autowiredpublic void setRedisUtils(RedisUtils redisUtils) {this.redisUtils = redisUtils;}@Overridepublic R SignApiAutoCode() {//生成验证SignString signKey = CodeUtils.creatCode(10);String signal = CodeUtils.creatCode(20);SignApiCode signApiCode = new SignApiCode();signApiCode.setSignal(signal);signApiCode.setSignKey(signKey);//设置30秒过期redisUtils.set(RedisTransKey.setServerSysKey(signKey),signApiCode,30, TimeUnit.SECONDS);return R.ok().put("sign",signApiCode);}@Overridepublic boolean AcceptApiAutoCode(String signKey,String signal) {//验证传回来的签发对不对,然后把这个进行删除Object o = redisUtils.get(RedisTransKey.getServerSysKey(signKey));SignApiCode signApiCode = JSON.parseObject(o.toString(), SignApiCode.class);redisUtils.del(RedisTransKey.getServerSysKey(signKey));return signApiCode.getSignal().equals(signal)&&signApiCode.getSignKey().equals(signKey);}
}

在这里的话,我用了几个工具类。当然这个在先前的whitehole都提到过。这里的话就不复述了,百度都能搞定。当然重要的是,这个项目后期也是开源的,这里只是记录一下具体的做法而已。后期可能会对代码进行优化,但是基本流程是不会发生太大改变的。

人人中台携带私钥访问

之后的话,就是我们的人人中台去携带我们的私钥去访问

package io.renren.config;
import com.huterox.common.sysEntity.SignApiCode;
import com.huterox.common.utils.FastJsonUtils;
import com.huterox.common.utils.R;
import com.huterox.feign.server.FeignAutoInnoApiSeverService;
import feign.RequestInterceptor;
import feign.RequestTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;import java.util.HashMap;
import java.util.Map;@Configuration
public class FeignRequestInterceptor implements RequestInterceptor {private FeignAutoInnoApiSeverService feignAutoInnoApiSeverService;public FeignRequestInterceptor(FeignAutoInnoApiSeverService feignAutoInnoApiSeverService) {this.feignAutoInnoApiSeverService = feignAutoInnoApiSeverService;}@Autowiredpublic void setFeignAutoInnoApiSeverService(FeignAutoInnoApiSeverService feignAutoInnoApiSeverService) {this.feignAutoInnoApiSeverService = feignAutoInnoApiSeverService;}@Overridepublic void apply(RequestTemplate template) {//先那到临时签证Map<String, String> map = new HashMap<>();map.put("innoHeader","HUTEROX");R sign = feignAutoInnoApiSeverService.getSign(map);//拿到签证去正式访问保护接口String signKey = "";String signal = "";int code = (int) sign.get("code");if(code==0){String sign1 = FastJsonUtils.toJson(sign.get("sign"));SignApiCode signApiCode = FastJsonUtils.fromJson(sign1, SignApiCode.class);signKey = signApiCode.getSignKey();signal = signApiCode.getSignal();}//发送远程调用请求,填写signApiCodetemplate.header("signKey",signKey);template.header("signal",signal);}}

私钥验证(博客系统)

之后的话,我们的博客系统就要去验证我们的密钥对不对。(其实你发现,这玩意不就是服务之间的验证码嘛)

这里的话,我们受保护的接口是这些:
在这里插入图片描述
所以的话,我们来创建一个切面来进行处理:

package com.huterox.hlangserver.aspect;
import com.huterox.common.utils.R;
import com.huterox.hlangserver.controller.innocontroller.auto.AutoInnoApiService;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;import javax.servlet.http.HttpServletRequest;@Aspect
@Component
public class InnoAutoAspect {@Pointcut("within(com.huterox.hlangserver.controller.innocontroller.api..*) && @annotation(org.springframework.web.bind.annotation.RequestMapping)")public void verification() {}private AutoInnoApiService autoInnoApiService;public InnoAutoAspect(AutoInnoApiService autoInnoApiService) {this.autoInnoApiService = autoInnoApiService;}@Autowiredpublic void setAutoInnoApiService(AutoInnoApiService autoInnoApiService) {this.autoInnoApiService = autoInnoApiService;}@Around("verification()")public R verification(ProceedingJoinPoint joinPoint) throws Throwable {HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.currentRequestAttributes()).getRequest();String signKey = request.getHeader("signKey");String signal = request.getHeader("signal");if(!autoInnoApiService.AcceptApiAutoCode(signKey, signal)){return R.error();}return (R) joinPoint.proceed();}
}

调试演示

okey,那么之后的话,我们来演示具体流程
(完整的前端怎么整合的我就不演示了,以前的博客都有,或者百度都可以)

我们来看到这个:
在这里插入图片描述

拿到私钥,然后扩充访问
在这里插入图片描述

之后的话再我们那个博客系统可以看到方行。

总结

okey,以上的就是我们今天的内容,当然这部分还有优化的点,首先就是我们的人人中台,在访问的时候,我们用的是apply,重写了里面的拦截。但是问题在于,这个是全局通用的,如果我们后面有另一个子系统,那么这个时候的话,就建议使用切面了。当然这里这样处理是因为,这里我就只设计两个子系统,上次的whitehole有9个微服务,服务器顶不住。所以这次不乱搞了,省点资源,后面再研究研究这个网站智能助手玩玩。

(ps: 有没有广州的大哥春招再联系联系(狗头))

相关文章:

毕设之-Hlang后端架构-双系统交互

文章目录 前言交互流程基本流程约定公钥人人中台携带公钥获取私钥私钥生成人人中台携带私钥访问私钥验证&#xff08;博客系统&#xff09; 调试演示总结 前言 前天我们完成了基本的整合&#xff0c;但是还没有整合到我们的业务系统&#xff0c;也就是博客系统。本来昨天要搞一…...

什么同源策略?

同源 同源指的是URL有相同的协议、主机名和端口号。 同源策略 同源策略指的是浏览器提供的安全功能&#xff0c;非同源的RUL之间不能进行资源交互 跨域 两个非同源之间要进行资源交互就是跨域。 浏览器对跨域请求的拦截 浏览器是允许跨域请求的&#xff0c;但是请求返回…...

破译模式:模式识别在计算机视觉中的作用

一、介绍 在当代数字领域&#xff0c;计算机视觉中的模式识别是关键的基石&#xff0c;推动着众多技术进步和应用。本文探讨了计算机视觉中模式识别的本质、方法、应用、挑战和未来趋势。通过使机器能够识别和解释视觉数据中的模式&#xff0c;模式识别不仅推动了计算机视觉领域…...

c语言-全局变量与局部变量

目录 1、&#xff08;作用&#xff09;域的概念 2、全局与局部的相对性 3、生命周期 3、静态变量static 结语&#xff1a; 前言&#xff1a; 在c语言中&#xff0c;全局变量的可见范围是整个工程&#xff0c;而局部变量的可见范围从该变量被定义到该作用域结束&#xff0c…...

【Spring】00 入门指南

文章目录 1.简介2.概念1&#xff09;控制反转&#xff08;IoC&#xff09;2&#xff09;依赖注入&#xff08;DI&#xff09; 3.核心模块1&#xff09;Spring Core2&#xff09;Spring AOP3&#xff09;Spring MVC4&#xff09;Spring Data5&#xff09;Spring Boot 4.编写 Hel…...

BIM 技术:CIM (City Information Modeling) 1-7 级

本心、输入输出、结果 文章目录 BIM 技术&#xff1a;CIM &#xff08;City Information Modeling&#xff09; 1-7 级前言城市信息模型&#xff08;CIM&#xff09;概述城市信息模型分级介绍CIM 1CIM 2CIM 3CIM 4CIM 5CIM 6CIM 7 花有重开日&#xff0c;人无再少年实践是检验真…...

c++ websocket 协议分析与实现

前言 网上有很多第三方库&#xff0c;nopoll,uwebsockets,libwebsockets,都喜欢回调或太复杂&#xff0c;个人只需要在后端用&#xff0c;所以手动写个&#xff1b; 1:环境 ubuntu18 g(支持c11即可) 第三方库:jsoncpp,openssl 2:安装 jsoncpp 读取json 配置文件 用 自动安装 网…...

kali虚拟机无网络

1.查看虚拟机的网卡模式 在虚拟机设置里&#xff0c;一般选择桥接模式&#xff0c;也可以选择NAT模式。 2、你的IP地址是否写死了&#xff08;设置为静态IP&#xff09; vim编辑模式下的命令&#xff1a; 按a或i进入编辑模式&#xff0c;然后按esc键退出编辑模式&#xff0c;s…...

Unity2023.3(Unity6)版本开始将可以发布WebGPU

翻译一段官网上的话&#xff1a; 利用Unity 2023.3(正式发布时应该称为Unity6)中最新的WebGPU图形API集成&#xff0c;尝试最大限度的提升您的网络游戏的真实感。 通过与谷歌的战略合作&#xff0c;Unity实时3D平台的强大的图形功能现在为图形丰富的网络游戏进行微调&#xff0…...

计算机网络期末考试A卷及答案

一、选择题&#xff08;30分&#xff0c;每题1分&#xff09; 世界上第一个网络系统是( C )。 A、ENIAC B、以太网 C、ARPANET D、DECNET 2&#xff0e;在常用的传输介质中&#xff0c;&#xff08; C &#xff09;的带宽最宽、信号传输衰减最小、抗干扰能力最强。 A.双绞线 …...

<蓝桥杯软件赛>零基础备赛20周--第10周--二分

报名明年4月蓝桥杯软件赛的同学们&#xff0c;如果你是大一零基础&#xff0c;目前懵懂中&#xff0c;不知该怎么办&#xff0c;可以看看本博客系列&#xff1a;备赛20周合集 20周的完整安排请点击&#xff1a;20周计划 每周发1个博客&#xff0c;共20周&#xff08;读者可以按…...

C++友元类,工厂模式和继承的融合案例

//友元没有继承性&#xff0c;没有传递性,所以在animal中定义友元类是无效的class animal{public:animal(){};virtual ~animal(){};};class Cat:public animal{friend class animalFactory;private:Cat(){}private:string m_name;string m_color;public:void about(){cout<&…...

使用 ?? 重新定义逻辑以获得更严格、更安全的 JavaScript 默认值

使用 ?? 重新定义逻辑以获得更严格、更安全的 JavaScript 默认值 JavaScript 中的 ?? 运算符称为 nullish 合并运算符。该运算符接受任一侧的操作数&#xff0c;并且仅当左侧操作数为空值时才返回右侧操作数。这个运算符绝对是一个较新的运算符&#xff0c;它是在 ES2020 …...

Could not initialize class org.codehaus.groovy.vmplugin.v7.Java7

问题描述&#xff1a;Could not initialize class org.codehaus.groovy.vmplugin.v7.Java7 最近在学习如何将YOLO部署在手机端&#xff0c;出现了许多错误&#xff0c;下面这个错误是手机和电脑连结之后&#xff0c;点击run之后出现的错误。 解决办法&#xff1a;将JDK版本将为…...

Python Django Suit:构建现代化的Django后台管理

概要 Django Suit是一款为Django后台管理提供现代、优雅界面的第三方应用&#xff0c;它致力于提升Django开发者的管理体验。本文将深入介绍Django Suit的安装、配置和高级功能&#xff0c;提供详实的示例代码&#xff0c;帮助大家更好地使用和定制Django后台管理界面。 安装与…...

电子学会C/C++编程等级考试2021年09月(六级)真题解析

C/C++等级考试(1~8级)全部真题・点这里 第1题:双端队列 定义一个双端队列,进队操作与普通队列一样,从队尾进入。出队操作既可以从队头,也可以从队尾。编程实现这个数据结构。 时间限制:1000 内存限制:65535输入 第一行输入一个整数t,代表测试数据的组数。 每组数据的…...

SpringBoot 源码解析

前言 本文只是纯源码分析文章&#xff0c;阅读者需要有Spring或者SpringBoot使用经验。 SpringBoot 源码解析 SpringBoot 源码解析1&#xff1a;环境搭建 SpringBoot 源码解析2&#xff1a;启动流程1 SpringBoot 源码解析3&#xff1a;启动流程2 SpringBoot 源码解析4&#…...

dockerfile---创建镜像

dockerfile创建镜像&#xff1a;创建自定义镜像。 包扩配置文件的创建&#xff0c;挂载点&#xff0c;对外暴露的端口。设置环境变量。 docker镜像的方式: 1、基于官方源进行创建 根据官方提供的镜像源&#xff0c;创建镜像&#xff0c;然后拉起容器。是一个白板&#xff0c…...

Raspberry PI + Codesys + EtherCAT步进驱动ECR60 Motion功能测试

原文连接&#xff1a;Raspberry PI Codesys EtherCAT步进驱动ECR60 Motion功能测试 – 个人资料收集 (rtplc.com) <div class"post_info_wrapper "> <p class"has-drop-cap">运动控制功能是codesys及EtherCAT通讯的重要功能&am…...

03 Temporal 详细介绍

前言 在后端开发中&#xff0c;大家是否有遇到如下类型的开发场景 需要处理较多的异步事件需要的外部服务可靠性较低需要记录保存某个对象的复杂状态 在以往的开发过程中&#xff0c;可能更多的直接使用数据库、定时任务、消息队列等作为基础&#xff0c;来解决上面的问题。然…...

Leetcode 3576. Transform Array to All Equal Elements

Leetcode 3576. Transform Array to All Equal Elements 1. 解题思路2. 代码实现 题目链接&#xff1a;3576. Transform Array to All Equal Elements 1. 解题思路 这一题思路上就是分别考察一下是否能将其转化为全1或者全-1数组即可。 至于每一种情况是否可以达到&#xf…...

React Native 开发环境搭建(全平台详解)

React Native 开发环境搭建&#xff08;全平台详解&#xff09; 在开始使用 React Native 开发移动应用之前&#xff0c;正确设置开发环境是至关重要的一步。本文将为你提供一份全面的指南&#xff0c;涵盖 macOS 和 Windows 平台的配置步骤&#xff0c;如何在 Android 和 iOS…...

Debian系统简介

目录 Debian系统介绍 Debian版本介绍 Debian软件源介绍 软件包管理工具dpkg dpkg核心指令详解 安装软件包 卸载软件包 查询软件包状态 验证软件包完整性 手动处理依赖关系 dpkg vs apt Debian系统介绍 Debian 和 Ubuntu 都是基于 Debian内核 的 Linux 发行版&#xff…...

【服务器压力测试】本地PC电脑作为服务器运行时出现卡顿和资源紧张(Windows/Linux)

要让本地PC电脑作为服务器运行时出现卡顿和资源紧张的情况&#xff0c;可以通过以下几种方式模拟或触发&#xff1a; 1. 增加CPU负载 运行大量计算密集型任务&#xff0c;例如&#xff1a; 使用多线程循环执行复杂计算&#xff08;如数学运算、加密解密等&#xff09;。运行图…...

【HTML-16】深入理解HTML中的块元素与行内元素

HTML元素根据其显示特性可以分为两大类&#xff1a;块元素(Block-level Elements)和行内元素(Inline Elements)。理解这两者的区别对于构建良好的网页布局至关重要。本文将全面解析这两种元素的特性、区别以及实际应用场景。 1. 块元素(Block-level Elements) 1.1 基本特性 …...

零基础设计模式——行为型模式 - 责任链模式

第四部分&#xff1a;行为型模式 - 责任链模式 (Chain of Responsibility Pattern) 欢迎来到行为型模式的学习&#xff01;行为型模式关注对象之间的职责分配、算法封装和对象间的交互。我们将学习的第一个行为型模式是责任链模式。 核心思想&#xff1a;使多个对象都有机会处…...

智能分布式爬虫的数据处理流水线优化:基于深度强化学习的数据质量控制

在数字化浪潮席卷全球的今天&#xff0c;数据已成为企业和研究机构的核心资产。智能分布式爬虫作为高效的数据采集工具&#xff0c;在大规模数据获取中发挥着关键作用。然而&#xff0c;传统的数据处理流水线在面对复杂多变的网络环境和海量异构数据时&#xff0c;常出现数据质…...

SiFli 52把Imagie图片,Font字体资源放在指定位置,编译成指定img.bin和font.bin的问题

分区配置 (ptab.json) img 属性介绍&#xff1a; img 属性指定分区存放的 image 名称&#xff0c;指定的 image 名称必须是当前工程生成的 binary 。 如果 binary 有多个文件&#xff0c;则以 proj_name:binary_name 格式指定文件名&#xff0c; proj_name 为工程 名&…...

R语言速释制剂QBD解决方案之三

本文是《Quality by Design for ANDAs: An Example for Immediate-Release Dosage Forms》第一个处方的R语言解决方案。 第一个处方研究评估原料药粒径分布、MCC/Lactose比例、崩解剂用量对制剂CQAs的影响。 第二处方研究用于理解颗粒外加硬脂酸镁和滑石粉对片剂质量和可生产…...

Java编程之桥接模式

定义 桥接模式&#xff08;Bridge Pattern&#xff09;属于结构型设计模式&#xff0c;它的核心意图是将抽象部分与实现部分分离&#xff0c;使它们可以独立地变化。这种模式通过组合关系来替代继承关系&#xff0c;从而降低了抽象和实现这两个可变维度之间的耦合度。 用例子…...