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

gateway做token校验

本文使用springcloud的gateway做token校验
登录的本质:拿用户名和密码 换 token。
token会返回给浏览器(存储),当访问的时候,携带token 发起请求。

  1. token校验图

在这里插入图片描述

  1. 引入redis依赖在这里插入图片描述

    		<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId></dependency>
    
  2. token校验过滤器
    在这里插入图片描述

package com.example.filter;import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.gateway.filter.GatewayFilterChain;
import org.springframework.cloud.gateway.filter.GlobalFilter;
import org.springframework.core.Ordered;
import org.springframework.core.io.buffer.DataBuffer;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus;
import org.springframework.http.server.reactive.ServerHttpRequest;
import org.springframework.http.server.reactive.ServerHttpResponse;
import org.springframework.stereotype.Component;
import org.springframework.util.CollectionUtils;
import org.springframework.util.StringUtils;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Mono;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;/*** token 校验*/
@Component
public class TokenCheckFilter implements GlobalFilter, Ordered {//GlobalFilter全局过滤器,Ordered 顺序优先级@Autowiredprivate StringRedisTemplate redisTemplate; //引入redis依赖,才能使用/*** 指定好放行的路径  (可以写在这,也可以写到配置文件中)* 白名单 (请求路径)*/public static final List<String> ALLOW_URL = Arrays.asList("login-service/doLogin","/myUrl");/***前提是? 和前端约定好,一般放在请求头中  key=Authorization, value=bearer token    (前缀:bearer+空格+token)* 1.拿到url  (GlobalFilter是全局过滤器,  但是,登录 没有token,要放行)* 2.判断放行   (登录+白名单 放行,不需要token)* 然后再校验token* 3.拿到 请求头* 4.拿到token* 5.校验 (看redis 中 有没有,如果没有就拦截,有就放行)* 6.放行/拦截** @param exchange* @param chain* @return*/@Overridepublic Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {//拿到url    请求路径ServerHttpRequest request = exchange.getRequest();String path = request.getURI().getPath();if (ALLOW_URL.contains(path)){//放行return chain.filter(exchange);}//校验HttpHeaders headers = request.getHeaders(); //拿到请求头List<String> authorization = headers.get("Authorization");if (!CollectionUtils.isEmpty(authorization)){ //key不为空,取第一个String token = authorization.get(0);if (StringUtils.hasText(token)){ //token不空//约定好有前缀 bearer tokenString realToken = token.replaceFirst("bearer ", "");// replaceFirst替换字符串前面if (StringUtils.hasText(realToken) && redisTemplate.hasKey(realToken)){//如果 请求头中 有token, 并且 redis中 有这个token(不带前缀)//放行return chain.filter(exchange);}}}//拦截ServerHttpResponse response = exchange.getResponse();response.getHeaders().set("content-type","application/json;charset=utf-8");HashMap<String, Object> map = new HashMap<>(4);//返回401map.put("code", HttpStatus.UNAUTHORIZED.value());map.put("msg","未授权");ObjectMapper objectMapper = new ObjectMapper();byte[] bytes = new byte[0]; //以字节形式 写到objectmappertry {bytes = objectMapper.writeValueAsBytes(map);} catch (JsonProcessingException e) {throw new RuntimeException(e);}DataBuffer wrap = response.bufferFactory().wrap(bytes);return response.writeWith(Mono.just(wrap));}@Overridepublic int getOrder() {return 2; //先校验ip,再校验token}
}
  1. 流程:

    前提: 和前端约定好
    token一般放在请求头中 key=Authorization, value=bearer token
    (前缀:bearer+空格+token)

    • 1.拿到url (GlobalFilter是全局过滤器, 但是,登录 没有token,要放行)
    • 2.判断放行 (登录+白名单 放行,不需要token)
    • 然后再校验token
    • 3.拿到 请求头
    • 4.拿到token
    • 5.校验 (看redis 中 有没有,如果没有就拦截,有就放行)
    • 6.放行/拦截

相关文章:

gateway做token校验

本文使用springcloud的gateway做token校验 登录的本质&#xff1a;拿用户名和密码 换 token。 token会返回给浏览器&#xff08;存储&#xff09;&#xff0c;当访问的时候&#xff0c;携带token 发起请求。 token校验图 引入redis依赖 <dependency><groupId>or…...

C#学习记录-线程

线程 定义&#xff1a;Thread t new Thread(Test); //可以用匿名 lamda 调用&#xff1a;t.Start("ljc6666");方法可以无参或一个参数&#xff0c;如果要传入多个参数&#xff0c;可以传入一个结构体 namespace _17_线程Thread {internal class Program{stati…...

Spring Boot 启动注解分析

虽然我们在日常开发中&#xff0c;Spring Boot 使用非常多&#xff0c;算是目前 Java 开发领域一个标配了&#xff0c;但是小伙伴们仔细想想自己的面试经历&#xff0c;和 Spring Boot 相关的面试题都有哪些&#xff1f;个人感觉应该是比较少的&#xff0c;Spring Boot 本质上还…...

React Native数据存储

最近做RN开发中需要数据存储&#xff0c;查阅RN官方资料&#xff0c;发现推荐我们使用 AsyncStorage,对使用步骤做一下记录。 AsyncStorage是什么 简单的&#xff0c;异步的&#xff0c;持久化的key-value存储系统AsyncStorage在IOS下存储分为两种情况&#xff1a; 存储内容较…...

【网络编程】揭开套接字的神秘面纱

文章目录 1 :peach:简单理解TCP/UDP协议 :peach:2 :peach:网络字节序 :peach:3 :peach:socket编程接口 :peach:3.1 :apple:socket 常见API :apple:3.2 :apple:sockaddr结构:apple: 4 :peach:简单的UDP网络程序 :peach:4.1 :apple:基本分析:apple:4.2 :apple:udpServer.hpp(重点…...

MySQL 8.0 事务定义和基本操作

MySQL 事务&#xff08;Transaction&#xff09;的四大特性&#xff1a;A、C、I、D A、原子性&#xff1a;&#xff08;Atomicity&#xff09; 一个事务是不可分割的最小工作单位。 执行的事务&#xff0c;要么全部成功&#xff0c;要么回滚到执行事务之前的状态。 C、一致…...

项目经理必备:常用的项目管理系统推荐!

当我们成为项目负责人时&#xff0c;找到合适的工具来管理跟进项目&#xff0c;就成为了迫切需要解决的问题。一款优秀的工具&#xff0c;在项目的管理跟进中&#xff0c;起着极为重要的作用&#xff0c;一般可以付费购买专门的项目管理软件。 1.可快速切换查看不同角度的项目信…...

【香瓜说职场】信任危机(2022.08.19)

自从17年4月份开始辞职创业&#xff0c;已经5年零4个月了。今天跟大家聊一点不太正能量的事。 首先关于“要不要说些不好的”这件事&#xff0c;我爸妈常建议我不要把不好的事情写出来&#xff0c;因为觉得丢人、不体面、怕影响合伙人关系、影响同事关系。而我觉得如果只写好的…...

【Rust】Rust学习 第六章枚举和模式匹配

本章介绍 枚举&#xff08;enumerations&#xff09;&#xff0c;也被称作 enums。枚举允许你通过列举可能的 成员&#xff08;variants&#xff09; 来定义一个类型。首先&#xff0c;我们会定义并使用一个枚举来展示它是如何连同数据一起编码信息的。接下来&#xff0c;我们会…...

Win10安装GPU支持的最新版本的tensorflow

我在安装好cuda和cudnn后&#xff0c;使用pip install tensorflow安装的tensorflow都提示不能找到GPU&#xff0c; 为此怀疑默认暗转的tensorflow是不带GPU支持的。 在tensorflow官网提供了多个版本的GPU支持的windows的安装包 https://www.tensorflow.org/install/pip?hlz…...

20个Golang自动化DevOps库

探索 20 个用于简化任务和提高生产力的重要库。 Golang&#xff0c;也称为 Go&#xff0c;是一种静态类型、编译型编程语言&#xff0c;由 Google 的 Robert Griesemer、Rob Pike 和 Ken Thompson 设计。它于 2009 年推出&#xff0c;旨在解决其他编程语言的缺点&#xff0c;特…...

【WiFi】WiFi 6E最新支持的国家和频段

信道Map图 国家和频段 CountryStatus Spectrum Andorra Adopted Considering 5945-6425 MHz 6425-7125 MHz ArgentinaAdopted5925-7125 MHzAustralia Adopted Considering 5925-6425 MHz 6425-7125 MHz Austria Adopted Considering 5945-6425 MHz 6425-7125 MHz BahrainA…...

如何使用html,包括css,js 画思维导图?有哪些可用的方法?

首先&#xff0c;创建一个新的HTML文件&#xff0c;可以使用任何文本编辑器。在文件中添加必要的标签和结构来定义网页的内容和布局。 <!DOCTYPE html> <html> <head><meta charset"UTF-8"><title>Mind Map</title><link re…...

机器学习---梯度下降代码

1. 归一化 # Read data from csv pga pd.read_csv("pga.csv") print(type(pga))print(pga.head())# Normalize the data 归一化值 (x - mean) / (std) pga.distance (pga.distance - pga.distance.mean()) / pga.distance.std() pga.accuracy (pga.accuracy - pg…...

【VB6|第23期】原来Jet.OLEDB也可以读取新版.xlsx的Excel文件

日期&#xff1a;2023年8月11日 作者&#xff1a;Commas 签名&#xff1a;(ง •_•)ง 积跬步以致千里,积小流以成江海…… 注释&#xff1a;如果您觉得有所帮助&#xff0c;帮忙点个赞&#xff0c;也可以关注我&#xff0c;我们一起成长&#xff1b;如果有不对的地方&#xf…...

通过控制ros节点的启停,软实现人工控制和紧急停止功能的图示

通过控制ros节点的启停&#xff0c;软实现人工控制和紧急停止功能的图示 实现原理简介&#xff1a; 人工控制的节点&#xff1a; 键盘节点 方向盘节点 自动控制的节点&#xff1a; movebase 导航 autoware 等 底盘节点&#xff1a; 差速底盘 阿克曼底盘 控制节点&#xff1…...

面试热题(滑动窗口最大值)

给你一个整数数组 nums&#xff0c;有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k 个数字。滑动窗口每次只向右移动一位。 返回 滑动窗口中的最大值 。 输入&#xff1a;nums [1,3,-1,-3,5,3,6,7], k 3 输出&#xff1a;[3,3,5,…...

【代码】表格封装 + 高级查询 + 搜索 +分页器 (极简)

一、标题 查询条件按钮&#xff08;Header&#xff09; <!-- Header 标题搜索栏 --> <template><div><div class"header"><div class"h-left"><div class"title"><div class"desc-test">…...

ant.design 组件库中的 Tree 组件实现可搜索的树: React+and+ts

ant.design 组件库中的 Tree 组件实现可搜索的树&#xff0c;在这里我会详细介绍每个方法&#xff0c;以及容易踩坑的点。 效果图&#xff1a; 首先是要导入的文件 // React 自带的属性 import React, { useMemo, useState } from react; // antd 组件库中的&#xff0c;输入…...

Linux系统编程之信号(上)

一、信号概念 信号就是软件中断。每当程序收到一个信号&#xff0c;都需要按指定的方法去处理。以下是UNIX系统的信号表。 其中core表示产生一个复制了该进程内存映像的core文件&#xff0c;它保存了程序现场&#xff0c;可以使用gdb来调试。 二、signal() signal()函数用于改…...

观成科技:隐蔽隧道工具Ligolo-ng加密流量分析

1.工具介绍 Ligolo-ng是一款由go编写的高效隧道工具&#xff0c;该工具基于TUN接口实现其功能&#xff0c;利用反向TCP/TLS连接建立一条隐蔽的通信信道&#xff0c;支持使用Let’s Encrypt自动生成证书。Ligolo-ng的通信隐蔽性体现在其支持多种连接方式&#xff0c;适应复杂网…...

生成xcframework

打包 XCFramework 的方法 XCFramework 是苹果推出的一种多平台二进制分发格式&#xff0c;可以包含多个架构和平台的代码。打包 XCFramework 通常用于分发库或框架。 使用 Xcode 命令行工具打包 通过 xcodebuild 命令可以打包 XCFramework。确保项目已经配置好需要支持的平台…...

深入剖析AI大模型:大模型时代的 Prompt 工程全解析

今天聊的内容&#xff0c;我认为是AI开发里面非常重要的内容。它在AI开发里无处不在&#xff0c;当你对 AI 助手说 "用李白的风格写一首关于人工智能的诗"&#xff0c;或者让翻译模型 "将这段合同翻译成商务日语" 时&#xff0c;输入的这句话就是 Prompt。…...

MySQL中【正则表达式】用法

MySQL 中正则表达式通过 REGEXP 或 RLIKE 操作符实现&#xff08;两者等价&#xff09;&#xff0c;用于在 WHERE 子句中进行复杂的字符串模式匹配。以下是核心用法和示例&#xff1a; 一、基础语法 SELECT column_name FROM table_name WHERE column_name REGEXP pattern; …...

Caliper 配置文件解析:config.yaml

Caliper 是一个区块链性能基准测试工具,用于评估不同区块链平台的性能。下面我将详细解释你提供的 fisco-bcos.json 文件结构,并说明它与 config.yaml 文件的关系。 fisco-bcos.json 文件解析 这个文件是针对 FISCO-BCOS 区块链网络的 Caliper 配置文件,主要包含以下几个部…...

全面解析各类VPN技术:GRE、IPsec、L2TP、SSL与MPLS VPN对比

目录 引言 VPN技术概述 GRE VPN 3.1 GRE封装结构 3.2 GRE的应用场景 GRE over IPsec 4.1 GRE over IPsec封装结构 4.2 为什么使用GRE over IPsec&#xff1f; IPsec VPN 5.1 IPsec传输模式&#xff08;Transport Mode&#xff09; 5.2 IPsec隧道模式&#xff08;Tunne…...

基于SpringBoot在线拍卖系统的设计和实现

摘 要 随着社会的发展&#xff0c;社会的各行各业都在利用信息化时代的优势。计算机的优势和普及使得各种信息系统的开发成为必需。 在线拍卖系统&#xff0c;主要的模块包括管理员&#xff1b;首页、个人中心、用户管理、商品类型管理、拍卖商品管理、历史竞拍管理、竞拍订单…...

【MATLAB代码】基于最大相关熵准则(MCC)的三维鲁棒卡尔曼滤波算法(MCC-KF),附源代码|订阅专栏后可直接查看

文章所述的代码实现了基于最大相关熵准则(MCC)的三维鲁棒卡尔曼滤波算法(MCC-KF),针对传感器观测数据中存在的脉冲型异常噪声问题,通过非线性加权机制提升滤波器的抗干扰能力。代码通过对比传统KF与MCC-KF在含异常值场景下的表现,验证了后者在状态估计鲁棒性方面的显著优…...

怎么让Comfyui导出的图像不包含工作流信息,

为了数据安全&#xff0c;让Comfyui导出的图像不包含工作流信息&#xff0c;导出的图像就不会拖到comfyui中加载出来工作流。 ComfyUI的目录下node.py 直接移除 pnginfo&#xff08;推荐&#xff09;​​ 在 save_images 方法中&#xff0c;​​删除或注释掉所有与 metadata …...

从零开始了解数据采集(二十八)——制造业数字孪生

近年来&#xff0c;我国的工业领域正经历一场前所未有的数字化变革&#xff0c;从“双碳目标”到工业互联网平台的推广&#xff0c;国家政策和市场需求共同推动了制造业的升级。在这场变革中&#xff0c;数字孪生技术成为备受关注的关键工具&#xff0c;它不仅让企业“看见”设…...