Spring Cloud Gateway 3.x 获取body中的数据鉴权

前言

SpringCloud Gateway建立在Spring Framework5、Project Reactor和Spring Boot2.0之上,使用WebFlux非阻塞API

什么是WebFlux?

官网:https://docs.spring.io/spring-framework/docs/current/reference/html/web-reactive.html

传统的Web框架,比如:struts2,springmvc等都是基于Servlet API与Servlet容器基础之上运行的。
但是
在Servlet3.1之后有了异步非阻塞的支持。而WebFlux是一个典型非阻塞异步的框架,它的核心是基于Reactor的相关API实现的。相对于传统的web框架来说,它可以运行在诸如Netty,Undertow及支持Servlet3.1的容器上。非阻塞式+函数式编程。
Spring WebFlux是Spring5引入的新的响应式框架,区别于Spring MVC,它不需要依赖Servle API,它是完全异步非阻塞的,并且基于Reactor来实现响应式流程规范

SpringCloudGateway的过滤器

通过全局过滤器GlobalFilter实现对header或body信息的判断、鉴权、拦截。

通过Request Header鉴权
@Slf4j
@Component
public class HeaderFilter implements GlobalFilter {private static final String defUsername = "admin" ;private static final String defPassword = "12345" ;//过滤器的优先级,数值越⼩,优先级越⾼@Order(0)@Overridepublic Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
//		方式1:通过http header获取参数ServerHttpRequest request = exchange.getRequest();String username = request.getHeaders().getFirst("username");String password = request.getHeaders().getFirst("password");String contentType = request.getHeaders().getFirst("content-type");log.info("Request Header:[username:" + username + ",password:" + password + ",contentType:" + contentType + "]");if (!defUsername.equals(username) || ! defPassword.equals(password)) {//认证失败,返回401System.out.println("当前用户未登陆,返回:" + HttpStatus.UNAUTHORIZED);exchange.getResponse().setStatusCode(HttpStatus.UNAUTHORIZED);return exchange.getResponse().setComplete();}//表⽰继续向下执⾏return chain.filter(exchange);}}
通过Request Body鉴权
/*** ReadJsonBody* 解析body判断json中的用户名、密码是否正确* @param exchange* @param chain* @return
*/
@Slf4j
@Component
public class BodyFilter implements GlobalFilter {private static final String defUsername = "admin" ;private static final String defPassword = "12345" ;private static final List<HttpMessageReader<?>> messageReaders = HandlerStrategies.withDefaults().messageReaders();/*** ReadJsonBody** @param exchange* @param chain* @return*/@Order(0)@Overridepublic Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {return DataBufferUtils.join(exchange.getRequest().getBody()).flatMap(dataBuffer -> {byte[] bytes = new byte[dataBuffer.readableByteCount()];dataBuffer.read(bytes);DataBufferUtils.release(dataBuffer);Flux<DataBuffer> cachedFlux = Flux.defer(() -> {DataBuffer buffer = exchange.getResponse().bufferFactory().wrap(bytes);DataBufferUtils.retain(buffer);return Mono.just(buffer);});ServerHttpRequest mutatedRequest = new ServerHttpRequestDecorator(exchange.getRequest()) {@Overridepublic Flux<DataBuffer> getBody() {return cachedFlux;}};ServerWebExchange mutatedExchange = exchange.mutate().request(mutatedRequest).build();return ServerRequest.create(mutatedExchange, messageReaders).bodyToMono(String.class).flatMap(objectValue -> {String str = "[GatewayContext]Read JsonBody:" + objectValue ;Gson gson = new Gson();JsonObject obj = gson.fromJson(objectValue, JsonElement.class).getAsJsonObject();JsonElement obj_username = obj.get("username");JsonElement obj_password = obj.get("password");boolean isnull = obj_username == null || obj_password == null ;if (isnull || !defUsername.equals(obj_username.getAsString()) || !defPassword.equals(obj_password.getAsString())) {// 认证失败,返回401log.info("{} 用户名或密码错误,返回{}",str,HttpStatus.UNAUTHORIZED);mutatedExchange.getResponse().setStatusCode(HttpStatus.UNAUTHORIZED);return mutatedExchange.getResponse().setComplete();}else {log.info("{},正确",str);}return chain.filter(exchange.mutate().request(mutatedRequest).build());});});}
}

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

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

相关文章

YOLOv9改进策略:注意力机制 | 动态稀疏注意力的双层路由方法BiLevelRoutingAttention | CVPR2023

&#x1f4a1;&#x1f4a1;&#x1f4a1;本文改进内容&#xff1a; CVPR2023 动态稀疏注意力的双层路由方法BiLevelRoutingAttention&#xff0c;强烈推荐&#xff0c;涨点很不错&#xff0c;同时被各个领域的魔改次数甚多&#xff0c;侧面验证了性能。 &#x1f4a1;&#x1…

我们该如何优化迭代自己?

哈喽&#xff0c;你好啊&#xff0c;我是雷工&#xff01; 一款软件如果想变得完美&#xff0c;那么肯定需要不断的试运行和更新迭代。 我们和软件一样&#xff0c;生活中难免会有错误的决策&#xff0c;失误的事件&#xff0c;为了能够解决我们自身存在的BUG&#xff0c;我们该…

设计用于驱动12 V汽车接地负载,VN5E160ASTR、VND5E160MJTR、VND5E025AKTR、VND5E050ACKTR 单/双通道高侧驱动器

摘要 意法半导体VIPower系列高侧开关符合汽车应用要求&#xff0c;内嵌先进的控制功能&#xff0c;其新型保护机制适用于各种负载类型及额定功率。 此类开关是汽车系统的理想选择&#xff0c;如&#xff1a;接线盒、内部/外部照明、直流电机驱动等&#xff0c;并适用于任何需…

[JAVA]12.ArrayList

一、ArrayList 1.1ArrayList类概述 - 什么是集合 ​ 提供一种存储空间可变的存储模型&#xff0c;存储的数据容量可以发生改变 - ArrayList集合的特点 ​ 底层是数组实现的&#xff0c;长度可以变化 - 泛型的使用 ​ 用于约束集合中存储元素的数据类型 1.2ArrayList类常…

基于nodejs+vue基于协同过滤算法的私人诊python-flask-django-php

实现后的私人诊所管理系统基于用户需求分析搭建的&#xff0c;并且会有个人中心&#xff0c;患者管理&#xff0c;医生管理&#xff0c;科室管理&#xff0c;出诊医生管理&#xff0c;预约挂号管理&#xff0c;预约取消管理&#xff0c;病历信息管理&#xff0c;药品信息管理&a…

qt事件机制学习笔记

实现闹钟功能 #include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget), speecher(new QTextToSpeech(this)) //给语音播报者实例化空间 {ui->setupUi(this); }Widget::~Widget() {delete …

【GameFramework框架内置模块】18、界面(UI)

推荐阅读 CSDN主页GitHub开源地址Unity3D插件分享简书地址QQ群&#xff1a;398291828 大家好&#xff0c;我是佛系工程师☆恬静的小魔龙☆&#xff0c;不定时更新Unity开发技巧&#xff0c;觉得有用记得一键三连哦。 一、前言 【GameFramework框架】系列教程目录&#xff1a;…

Spark SQL 数据源

Spark SQL 数据源 Spark SQL支持读取很多种数据源&#xff0c;比如parquet文件&#xff0c;json文件&#xff0c;文本文件&#xff0c;数据库等。下面列出了具体的一些数据源&#xff1a; Parquet文件Orc文件Json文件Hive表JDBC 先把people.json导入到hdfs的tmp目录下。peop…

多模态模型学习1——CLIP对比学习 语言-图像预训练模型

多模态模型学习1——CLIP对比学习 语言-图像预训练模型 1.背景介绍 随着互联网的快速发展&#xff0c;图像和文本数据呈现爆炸式增长。如何有效地理解和处理这些多模态数据&#xff0c;成为人工智能领域的一个重要研究方向。多模态模型学习旨在通过联合学习图像和文本表示&am…

WebGIS开发应该从哪些方面做准备

工程化思想 环境配置项目构建npm&#xff1a;Node包管理器&#xff0c;是 JavaScript 运行时 Node.js 的默认程序包管理器。 https://www.freecodecamp.org/chinese/news/what-is-npm-a-node-package-manager-tutorial-for-beginners/新建一个前端工程项目&#xff1a;前端框…

在项目中数据库如何优化?【MySQL主从复制(创建一个从节点复制备份数据)】【数据库读写分离ShardingJDBC(主库写,从库读)】

MySQL主从复制 MySQL主从复制介绍MySQL复制过程分成三步&#xff1a;1). MySQL master 将数据变更写入二进制日志( binary log)2). slave将master的binary log拷贝到它的中继日志&#xff08;relay log&#xff09;3). slave重做中继日志中的事件&#xff0c;将数据变更反映它自…

Vue 02 组件、Vue CLI

Vue学习 Vue 0201 组件引入概念组件的两种编写形式① 非单文件组件基本使用使用细节组件嵌套组件本质 VueComponent重要的内置关系 ② 单文件组件 02 Vue CLI介绍 & 文档安装使用步骤脚手架结构render默认配置ref 属性props配置mixin配置项插件scoped 样式案例&#xff1a;…

MySQL将id相同的两行数据合并group_concat

MySQL将id相同的两行数据合并 group_concat这个函数能将相同的行组合起来&#xff0c;省老事了。 MySQL中group_concat函数 完整的语法如下&#xff1a; group_concat([DISTINCT] 要连接的字段 [Order BY ASC/DESC 排序字段] [Separator ‘分隔符’]) 1.基本查询 Sql代码 2.…

MYSql通过FULLTEXT实现全文检索

FULLTEXT 是关系型数据库管理系统&#xff08;如 MySQL&#xff09;中用于全文检索的功能。它允许用户在表中的文本列上执行全文搜索。以下是 FULLTEXT 索引的工作原理和实现全文检索的方法&#xff1a; 1. **创建全文索引**&#xff1a; 在关系型数据库中&#xff0c;你可以为…

java Web会议信息管理系统 用eclipse定制开发mysql数据库BS模式java编程jdbc

一、源码特点 jsp 会议信息管理系统是一套完善的web设计系统&#xff0c;对理解JSP java SERLVET mvc编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。开发环境为TOMCAT7.0,eclipse开发&#xff0c;数据库为Mysql5.0&am…

ActiveMQ-04如何搭建一个完美的ActiveMQ集群

集群架构是一个很大的话题&#xff0c;官网就给我们介绍了几种 客户端&#xff1a;队列消费者集群-Queue Consumer Clusters服务端&#xff1a;Broker集群 - Broker Clusters 静态发现动态发现 服务端&#xff1a;Master-Slave 主从集群 Shared File System Master SlaveJDBC …

Github 2024-03-26 开源项目日报 Top10

根据Github Trendings的统计,今日(2024-03-26统计)共有10个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量Python项目3TypeScript项目3Jupyter Notebook项目2C++项目1GDScript项目1Lua项目1Solidity项目1Open Interpreter: 本地代码运行和自然语言界面…

Android release 混淆编译 private、protected自动变public问题解决

场景&#xff1a; 用assembleRelease编译aar的时候&#xff0c;成员变量private、protected自动变public&#xff1b; 用assembleDebug编译aar&#xff0c;则正常&#xff0c;于是对比了build.gradle&#xff0c;发现debug没启用混淆&#xff0c; release版本启动了混淆 解决…

力扣hot100:207. 课程表

这是一道拓扑排序问题&#xff0c;也可以使用DFS判断图中是否存在环。详情请见&#xff1a;官方的BFS算法请忽略&#xff0c;BFS将问题的实际意义给模糊了&#xff0c;不如用普通拓扑排序思想。 数据结构&#xff1a;图的拓扑排序与关键路径 拓扑排序&#xff1a; class Sol…

鸿蒙APP开发实战:【Api9】拍照、拍视频;选择图片、视频、文件工具类

鸿蒙开发过程中&#xff0c;经常会进行系统调用&#xff0c;拍照、拍视频、选择图库图片、选择图库视频、选择文件。今天就给大家分享一个工具类。 1. 话不多说&#xff0c;先展示样式 2.设计思路 根据官方提供的指南开发工具类&#xff0c;基础的拍照、拍视频、图库选照片、…