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

-
引入redis依赖

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId></dependency> -
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}
}
-
流程:
前提: 和前端约定好
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校验 登录的本质:拿用户名和密码 换 token。 token会返回给浏览器(存储),当访问的时候,携带token 发起请求。 token校验图 引入redis依赖 <dependency><groupId>or…...
C#学习记录-线程
线程 定义:Thread t new Thread(Test); //可以用匿名 lamda 调用:t.Start("ljc6666");方法可以无参或一个参数,如果要传入多个参数,可以传入一个结构体 namespace _17_线程Thread {internal class Program{stati…...
Spring Boot 启动注解分析
虽然我们在日常开发中,Spring Boot 使用非常多,算是目前 Java 开发领域一个标配了,但是小伙伴们仔细想想自己的面试经历,和 Spring Boot 相关的面试题都有哪些?个人感觉应该是比较少的,Spring Boot 本质上还…...
React Native数据存储
最近做RN开发中需要数据存储,查阅RN官方资料,发现推荐我们使用 AsyncStorage,对使用步骤做一下记录。 AsyncStorage是什么 简单的,异步的,持久化的key-value存储系统AsyncStorage在IOS下存储分为两种情况: 存储内容较…...
【网络编程】揭开套接字的神秘面纱
文章目录 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 事务(Transaction)的四大特性:A、C、I、D A、原子性:(Atomicity) 一个事务是不可分割的最小工作单位。 执行的事务,要么全部成功,要么回滚到执行事务之前的状态。 C、一致…...
项目经理必备:常用的项目管理系统推荐!
当我们成为项目负责人时,找到合适的工具来管理跟进项目,就成为了迫切需要解决的问题。一款优秀的工具,在项目的管理跟进中,起着极为重要的作用,一般可以付费购买专门的项目管理软件。 1.可快速切换查看不同角度的项目信…...
【香瓜说职场】信任危机(2022.08.19)
自从17年4月份开始辞职创业,已经5年零4个月了。今天跟大家聊一点不太正能量的事。 首先关于“要不要说些不好的”这件事,我爸妈常建议我不要把不好的事情写出来,因为觉得丢人、不体面、怕影响合伙人关系、影响同事关系。而我觉得如果只写好的…...
【Rust】Rust学习 第六章枚举和模式匹配
本章介绍 枚举(enumerations),也被称作 enums。枚举允许你通过列举可能的 成员(variants) 来定义一个类型。首先,我们会定义并使用一个枚举来展示它是如何连同数据一起编码信息的。接下来,我们会…...
Win10安装GPU支持的最新版本的tensorflow
我在安装好cuda和cudnn后,使用pip install tensorflow安装的tensorflow都提示不能找到GPU, 为此怀疑默认暗转的tensorflow是不带GPU支持的。 在tensorflow官网提供了多个版本的GPU支持的windows的安装包 https://www.tensorflow.org/install/pip?hlz…...
20个Golang自动化DevOps库
探索 20 个用于简化任务和提高生产力的重要库。 Golang,也称为 Go,是一种静态类型、编译型编程语言,由 Google 的 Robert Griesemer、Rob Pike 和 Ken Thompson 设计。它于 2009 年推出,旨在解决其他编程语言的缺点,特…...
【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 画思维导图?有哪些可用的方法?
首先,创建一个新的HTML文件,可以使用任何文本编辑器。在文件中添加必要的标签和结构来定义网页的内容和布局。 <!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文件
日期:2023年8月11日 作者:Commas 签名:(ง •_•)ง 积跬步以致千里,积小流以成江海…… 注释:如果您觉得有所帮助,帮忙点个赞,也可以关注我,我们一起成长;如果有不对的地方…...
通过控制ros节点的启停,软实现人工控制和紧急停止功能的图示
通过控制ros节点的启停,软实现人工控制和紧急停止功能的图示 实现原理简介: 人工控制的节点: 键盘节点 方向盘节点 自动控制的节点: movebase 导航 autoware 等 底盘节点: 差速底盘 阿克曼底盘 控制节点࿱…...
面试热题(滑动窗口最大值)
给你一个整数数组 nums,有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k 个数字。滑动窗口每次只向右移动一位。 返回 滑动窗口中的最大值 。 输入:nums [1,3,-1,-3,5,3,6,7], k 3 输出:[3,3,5,…...
【代码】表格封装 + 高级查询 + 搜索 +分页器 (极简)
一、标题 查询条件按钮(Header) <!-- 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 组件实现可搜索的树,在这里我会详细介绍每个方法,以及容易踩坑的点。 效果图: 首先是要导入的文件 // React 自带的属性 import React, { useMemo, useState } from react; // antd 组件库中的,输入…...
Linux系统编程之信号(上)
一、信号概念 信号就是软件中断。每当程序收到一个信号,都需要按指定的方法去处理。以下是UNIX系统的信号表。 其中core表示产生一个复制了该进程内存映像的core文件,它保存了程序现场,可以使用gdb来调试。 二、signal() signal()函数用于改…...
为什么92%的AI PoC项目在Docker沙箱中泄露训练数据?:深度解析cgroups v2 + seccomp + no-new-privileges三重失效链及修复checklist
更多请点击: https://intelliparadigm.com 第一章:Docker Sandbox 运行 AI 代码隔离技术对比评测报告 在 AI 模型开发与部署实践中,安全执行不可信第三方代码(如用户提交的推理脚本、自定义训练逻辑)已成为关键挑战。…...
终极音乐格式转换解决方案:如何用QMCDecode轻松解锁QQ音乐加密文件
终极音乐格式转换解决方案:如何用QMCDecode轻松解锁QQ音乐加密文件 【免费下载链接】QMCDecode QQ音乐QMC格式转换为普通格式(qmcflac转flac,qmc0,qmc3转mp3, mflac,mflac0等转flac),仅支持macOS,可自动识别到QQ音乐下载目录&…...
开发者职业倦怠自救手册:找回编码的快乐——写给软件测试从业者的专业指南
我们为何“倦”了?在软件测试领域深耕多年后,许多从业者会经历这样一个阶段:曾经对发现Bug、保障质量充满热情,如今却感到重复、枯燥甚至迷茫。每天面对相似的测试用例、无穷的回归测试、复杂的自动化脚本维护,以及不断…...
3个突破性方案:如何解决工业视觉的形状识别难题?
3个突破性方案:如何解决工业视觉的形状识别难题? 【免费下载链接】shape_based_matching try to implement halcon shape based matching, refer to machine vision algorithms and applications, page 317 3.11.5, written by halcon engineers 项目地…...
Phi-4-mini-reasoning企业落地:保险条款自动推理与理赔逻辑校验系统
Phi-4-mini-reasoning企业落地:保险条款自动推理与理赔逻辑校验系统 1. 项目背景与价值 保险行业长期面临两大核心痛点:复杂的条款解读和繁琐的理赔审核。传统人工处理方式存在效率低、成本高、标准不统一等问题。Phi-4-mini-reasoning模型凭借其强大的…...
实测对比:三家安卓加固方案防GG修改器的实战效果哪家强?
都说自己的加固方案能防内存修改,但在GG修改器这种“老牌”神器面前,实际效果到底如何?光听销售讲PPT可不行。为了搞清楚这个问题,我以一款普通的Unity游戏Demo为例,对市面上三家典型的安卓安全加固方案进行了一次横向…...
GPFS 集群运维「神器」:手搓一个 EC 模式可视化监控平台,实现自动化飞书告警!
01 存储运维的「黑盒」之痛 做过大规模 GPFS(IBM Spectrum Scale)集群运维的同学都懂: 集群拓扑全靠 mmlscluster、mmlsnsd 命令脑补;EC(Erasure Coding,纠删码)模式的磁盘、Vdisk、Pdisk 关系错…...
手把手拆解FusionAD:从BEV特征融合到轨迹优化,一个端到端自动驾驶模型的实战解析
手把手拆解FusionAD:从BEV特征融合到轨迹优化,一个端到端自动驾驶模型的实战解析 自动驾驶技术正在经历从模块化到端到端的范式转变,而FusionAD作为这一领域的代表性工作,通过多模态BEV特征融合和时间序列建模,实现了感…...
LiveAutoRecord技术深度解析:如何实现跨平台直播自动录制的模块化架构
LiveAutoRecord技术深度解析:如何实现跨平台直播自动录制的模块化架构 【免费下载链接】LiveAutoRecord 基于 Electron 的多平台直播自动录制软件 项目地址: https://gitcode.com/GitHub_Trending/li/LiveAutoRecord 在直播内容生态日益繁荣的今天࿰…...
打卡信奥刷题(3180)用C++实现信奥题 P8015 [COCI 2013/2014 #4] GUMA
P8015 [COCI 2013/2014 #4] GUMA 题目描述 给出一个 N 1 N1 N1 列的矩形,第 i i i 列必须通过水平切割 A i − 1 A_i-1 Ai−1 次被等分成 A i A_i Ai 份,请你求出最少需要几次切割才能按要求分割完。 T i p s : Tips: Tips: 一次切割一次可以…...
