go-zero中间件的使用
一、自定义中间件
-
1、在
api
中在服务中定义一个中间件,名字随便取type PostDemoReq {Name string `json:"name" validate:"required"` // 姓名Age int64 `json:"age" validate:"required,gte=1,lte=130"` // 年龄// optional 表示可选,omitempty如果为空的时候不走后面Mobile string `json:"mobile,optional" validate:"omitempty,checkMobile"` // 手机号码Email string `json:"email,optional" validate:"omitempty,checkEmail"` // 邮箱地址Date string `json:"date" validate:"omitempty,checkDate,checkAfterDate"` // 时间Password string `json:"password" validate:"required"` // 密码ConfimPassword string `json:"confimPassword" validate:"eqfield=Password"` // 确认密码 }// 一般返回 type Response {Name string `json:"name"`Age int64 `json:"age"` }// 分页显示的 type UserPageResp {Data []Response `json:"data"` // 数据Total int64 `json:"total"` // 总条数PageSize int64 `json:"pageSize"` // 当前条数PageNumber int64 `json:"pageNumber"` // 当前页数 }type GetUserPageReq {PageNumber int64 `query:"pageNumber"`PageSize int64 `query:"pageSize"` }@server (prefix: demo/v1group: demomiddleware: AuthMiddleware ) service demo-api {@doc "添加"@handler PostDemoHandlerpost /postDemo (PostDemoReq) returns (Response)@doc "分页获取用户"@handler GetUserPageApiget /user/page (GetUserPageReq) returns (UserPageResp) }
-
2、使用命令生成文件
goctl api go -api *.api -dir . --style=gozero
-
3、查看路由中是否使用了中间件,还生成了中间件文件
-
4、在中间件中补充内容
package middlewareimport ("github.com/zeromicro/go-zero/core/logx""net/http" )type AuthMiddleware struct { }func NewAuthMiddleware() *AuthMiddleware {return &AuthMiddleware{} }func (m *AuthMiddleware) Handle(next http.HandlerFunc) http.HandlerFunc {return func(w http.ResponseWriter, r *http.Request) {logx.Info("请求之前") // 填充逻辑next(w, r)logx.Info("请求之后")} }
-
5、请求日志输出
二、全局中间件
-
1、上面的方式只能在使用路由的时候才生效
-
2、在路由中取消中间件
-
3、自定义中间件
package middlewareimport ("github.com/zeromicro/go-zero/core/logx""net/http" )func LogMiddleware(next http.HandlerFunc) http.HandlerFunc {return func(w http.ResponseWriter, r *http.Request) {logx.Info("请求前...")next(w, r)logx.Info("请求后....")} }
-
4、在启动文件中加入自定义中间件
func main() {flag.Parse()var c config.Configconf.MustLoad(*configFile, &c)server := rest.MustNewServer(c.RestConf)defer server.Stop()ctx := svc.NewServiceContext(c)handler.RegisterHandlers(server, ctx)// 全局中间件server.Use(middleware.LogMiddleware)fmt.Printf("Starting server at %s:%d...\n", c.Host, c.Port)server.Start() }
三、自定义跨域全局中间件
-
1、创建中间件
package middlewareimport ("net/http" )func CorsMiddleware(next http.HandlerFunc) http.HandlerFunc {return func(w http.ResponseWriter, r *http.Request) {//指定允许其他域名访问//ctx.Writer.Header().Set("Access-Control-Allow-Origin", "http://localhost:8080")w.Header().Set("Access-Control-Allow-Origin", "*") //跨域:CORS(跨来源资源共享)策略//预检结果缓存时间w.Header().Set("Access-Control-Max-Age", "86400")//允许的请求类型(GET,POST等)w.Header().Set("Access-Control-Allow-Methods", "*")//允许的请求头字段w.Header().Set("Access-Control-Allow-Headers", "*")//是否允许后续请求携带认证信息(cookies),该值只能是true,否则不返回w.Header().Set("Access-Control-Allow-Credentials", "true")if r.Method == http.MethodOptions {w.WriteHeader(http.StatusOK)return}next(w, r)} }
-
2、使用中间件
// 全局中间件 server.Use(middleware.LogMiddleware) server.Use(middleware.CorsMiddleware)
四、自定义Auth
鉴权中间件
-
1、这里不使用
jwt
的方式,采用登录后自己根据规则生成唯一识别的存到redis
中,jwt
的方式可以自己网上搜索 -
2、项目中安装
redis
github.com/go-redis/redis/v8
-
3、配置文件中写上配置
Name: demo-api Host: 0.0.0.0 Port: 8888# redis配置 RedisConfig:Host: localhostPort: 6379Pass: ""Tls: false
-
4、配置文件中添加配置
package configimport "github.com/zeromicro/go-zero/rest"type Config struct {rest.RestConf// 使用redisRedisConfig struct {Host stringPort intPass stringTls bool} }
-
5、定义一个
redisDb.go
的文件package databaseimport ("fmt""github.com/go-redis/redis/v8" )func NewRedisDB(host, pass string, port int) *redis.Client {redisDb := redis.NewClient(&redis.Options{Addr: fmt.Sprintf("%s:%d", host, port),Password: pass,DB: 0,})return redisDb }
-
6、在
internal\svc\servicecontext.go
中注册redis
package svcimport ("github.com/go-redis/redis/v8""github.com/zeromicro/go-zero/rest""go_zero_demo06/internal/config""go_zero_demo06/internal/database""go_zero_demo06/internal/middleware" )type ServiceContext struct {Config config.ConfigAuthMiddleware rest.MiddlewareRedisDb *redis.Client }func NewServiceContext(c config.Config) *ServiceContext {redisDb := database.NewRedisDB(c.RedisConfig.Host, c.RedisConfig.Pass, c.RedisConfig.Port)return &ServiceContext{Config: c,AuthMiddleware: middleware.NewAuthMiddleware(redisDb).Handle,RedisDb: redisDb,} }
-
7、中间件中修改
package middlewareimport ("context""fmt""github.com/go-redis/redis/v8""net/http" )type AuthMiddleware struct {RedisDb *redis.Client }func NewAuthMiddleware(redisDb *redis.Client) *AuthMiddleware {return &AuthMiddleware{RedisDb: redisDb,} }func (m *AuthMiddleware) Handle(next http.HandlerFunc) http.HandlerFunc {return func(w http.ResponseWriter, r *http.Request) {token := r.Header.Get("token")fmt.Println("请求的token", token)if token == "" {w.WriteHeader(http.StatusAccepted)w.Write([]byte("请登录"))return}get := m.RedisDb.Get(r.Context(), token)fmt.Println(get, "redis中读取的数据")// 下面的模拟将从token中读取到的数据塞到上下文中ctx := context.WithValue(r.Context(), "accountId", "1")ctx = context.WithValue(ctx, "username", "admin")next(w, r.WithContext(ctx))} }
-
8、请求结果
-
9、在别的地方读取上下文中传递的参数
-
在
handler
中fmt.Println("获取请求头传递的数据", r.Context().Value("accountId")) fmt.Println("获取请求头传递的数据", r.Context().Value("username"))
-
在
logic
中fmt.Println("获取请求头传递的数据1", l.ctx.Value("accountId")) fmt.Println("获取请求头传递的数据2", l.ctx.Value("username"))
-
五、参考文件
- 官方地址
相关文章:

go-zero中间件的使用
一、自定义中间件 1、在api中在服务中定义一个中间件,名字随便取 type PostDemoReq {Name string json:"name" validate:"required" // 姓名Age int64 json:"age" validate:"required,gte1,lte130" // 年龄// optional 表示可选,omi…...
六、ESP32-S3上使用MicroPython点亮WS2812智能LED灯珠并通过web控制改变灯珠颜色优化超时和线程
实现通过ESP32S3连接Wi-Fi并使用Web页面控制WS2812灯珠的颜色,可以使用ESP32的WebServer库来创建一个简单的Web界面。通过这个界面,可以动态地控制灯珠的显示效果。 针对 五、ESP32-S3上使用MicroPython点亮WS2812智能LED灯珠并通过web控制改变灯珠颜色…...

(el-Time-Picker)操作(不使用 ts):Element-plus 中 TimePicker 组件的使用及输出想要时间格式需求的解决过程
Ⅰ、Element-plus 提供的 TimePicker 时间选择器组件与想要目标情况的对比: 1、Element-plus 提供 TimePicker 组件情况: 其一、Element-ui 自提供的 TimePicker 代码情况为(示例的代码): // Element-plus 提供的组件代码: <template>…...

UIAbility组件基础(一)
一、概述 UIAbility组件是一种包含UI的应用组件,主要用于和用户交互。UIAbility组件是系统调度的基本单元,为应用提供绘制界面的窗口。一个应用可以包含一个或多个UIAbility组件。每一个UIAbility组件实例都会在最近任务列表中显示一个对应的任务。 U…...

神经网络的数学原理
前言:Hello大家好,我是小哥谈。人工智能技术的发展与成功应用已经成为21世纪科技领域最大的新现象。然而,科学地理解人工智能原理已经超出了现有科学体系的范畴。显然,人工智能是人类科学技术发展的必然结果,人工智能科学也将是人类科学进步与发展必然实现的目标🌈 …...

Java设计模式-抽象工厂模式-一次性理解透
1. 抽象工厂模式简介 抽象工厂设计模式是创建型模式之一。抽象工厂模式与工厂模式几乎相似,只是它更像工厂中的工厂。 如果您熟悉Java 中的工厂设计模式,或看过上一篇我写的“java简单工厂模式”,您会注意到我们有一个工厂类。此工厂类根据…...

day16-测试自动化之selenium的PO模式
一、PO模式介绍 PO(Page Object)模式是一种在自动化测试中常用的设计模式,将页面的每个元素封装成一个对象,通过操作对象来进行页面的交互。 一般分为六个版本,现在大部分企业都用的V4版本,三层结构…...
Springboot+freemarker大段文本内容动态修改输出,所见即所得
场景:给领导导出数据时,需要给出一个针对专业名词的解释说明,因此会存在有大批量的、大段的文本内容。如果直接写在代码里面,没啥大问题,但是大量的拼接替换、格式样式、后续修改维护等,都不是很方便。如果…...
Kali Linux网络问题解决与静态IP配置技巧
很多用户在使用 Kali Linux 时会遇到无法联网的问题,尤其是在 VMware 虚拟机中。这种情况相当常见,一般都是没有配置DNS服务器或者网卡配置文件的IP和虚拟网络编辑器的IP不一致所导致的,下面我们将探讨如何在 Kali Linux 中配置 DNS 服务和设…...
网络状态码-经验笔记
网络状态码-经验笔记 引言 在网络通信中,HTTP(Hypertext Transfer Protocol)状态码是服务器向客户端(通常是Web浏览器)发送响应时所包含的重要信息之一。 这些状态码指示了客户端请求的结果。 了解并正确使用这些状态…...
c++ 实现 actor 框架
服务端:https://github.com/xukeawsl/coro_actor 客户端:https://github.com/xukeawsl/coro_actor_client...

应对猫咪掉毛挑战,希喂、小米热门宠物空气净化器实测功效PK
随着养宠人群的增多,铲屎官们的需求日益增长,市场上出现了很多品牌的宠物空气净化器。然而,产品质量参差不齐,给消费者选择带来不少困难。劣质宠物空气净化器不仅无法有效去除宠物毛发、皮屑、异味及空气中的有害微粒,…...
0002 保险会计及其特殊性
保险会计是将会计理论专门应用于保险公司的专业会计领域,它是会计学的一个重要分支。作为一个分支,保险会计具有独特的特性,这些特性主要表现在以下几个方面: 产品的无形性:保险产品本质上是一种无形的商品,…...

ChatTTS:终极文本转语音工具,支持API!
ChatTTS:终极文本转语音工具,支持API! 文本转语音(TTS)系统的发展已经取得了长足的进步。从最初的机械化、平坦的声音,到如今听起来令人惊讶的人声,ChatTTS作为这一领域的新成员,旨…...

VUE和Element Plus
1.VUE 1.下载和配置环境 使用vue编程,我们需要使用到的编程软件是vs code,还需要使用node.js,这个的作用就类似于JDK,当我们都下载好之后,winR键打开命令提示符,我们在这里可以查看版本, npm…...
Python学习笔记(五)
""" 演示tuple元组的定义和操作 """# 元组一旦定义完成,就不可修改 # 定义元组 # t1 (1, "Hello", True) # t2 () # 定义空元组 # t3 tuple() #定义空元组 # print(f"t1的类型是:{type(t1)}, 内容是&…...
Linux企业级应用(一)构建企业级Linux应用平台:全面指南
文章目录 构建企业级Linux应用平台:全面指南前言1. Linux企业级应用简介2. 构建企业级网站应用平台使用LNMP架构构建Web服务器部署MySQL数据库主从复制与读写分离 3. 实施虚拟化技术部署KVM虚拟化平台使用LVS和Keepalived实现负载均衡与高可用性 4. 文件系统与分布式…...
LeetCode112 路径总和
前言 题目: 112. 路径总和 文档: 代码随想录——路径总和 编程语言: C 解题状态: 成功解答! 思路 比较简单的一个思路是遍历所有的路径,求和后再查找目标值。但是,最好的方法是一边遍历&#x…...

TI AWR1843 毫米波雷达实物展示
引言 随着自动驾驶、工业自动化以及智能交通系统的快速发展,雷达传感器在现代科技中的重要性日益提升。毫米波雷达凭借其高精度测距、抗干扰能力强等特点,逐渐成为各类感知系统中的关键技术。德州仪器(TI)推出的 AWR1843 毫米波雷…...
前端JS总结(下)之事件操作
目录 前言 事件基础 事件的三部分: 常见的事件: 鼠标事件: 键盘事件: 表单事件: onfocus和onblur:获取焦点和失去焦点 onselect:选中单行文本框/多行文本框中的内容 onchangeÿ…...

安宝特方案丨XRSOP人员作业标准化管理平台:AR智慧点检验收套件
在选煤厂、化工厂、钢铁厂等过程生产型企业,其生产设备的运行效率和非计划停机对工业制造效益有较大影响。 随着企业自动化和智能化建设的推进,需提前预防假检、错检、漏检,推动智慧生产运维系统数据的流动和现场赋能应用。同时,…...

vscode(仍待补充)
写于2025 6.9 主包将加入vscode这个更权威的圈子 vscode的基本使用 侧边栏 vscode还能连接ssh? debug时使用的launch文件 1.task.json {"tasks": [{"type": "cppbuild","label": "C/C: gcc.exe 生成活动文件"…...
Java多线程实现之Callable接口深度解析
Java多线程实现之Callable接口深度解析 一、Callable接口概述1.1 接口定义1.2 与Runnable接口的对比1.3 Future接口与FutureTask类 二、Callable接口的基本使用方法2.1 传统方式实现Callable接口2.2 使用Lambda表达式简化Callable实现2.3 使用FutureTask类执行Callable任务 三、…...

srs linux
下载编译运行 git clone https:///ossrs/srs.git ./configure --h265on make 编译完成后即可启动SRS # 启动 ./objs/srs -c conf/srs.conf # 查看日志 tail -n 30 -f ./objs/srs.log 开放端口 默认RTMP接收推流端口是1935,SRS管理页面端口是8080,可…...

新能源汽车智慧充电桩管理方案:新能源充电桩散热问题及消防安全监管方案
随着新能源汽车的快速普及,充电桩作为核心配套设施,其安全性与可靠性备受关注。然而,在高温、高负荷运行环境下,充电桩的散热问题与消防安全隐患日益凸显,成为制约行业发展的关键瓶颈。 如何通过智慧化管理手段优化散…...
Spring是如何解决Bean的循环依赖:三级缓存机制
1、什么是 Bean 的循环依赖 在 Spring框架中,Bean 的循环依赖是指多个 Bean 之间互相持有对方引用,形成闭环依赖关系的现象。 多个 Bean 的依赖关系构成环形链路,例如: 双向依赖:Bean A 依赖 Bean B,同时 Bean B 也依赖 Bean A(A↔B)。链条循环: Bean A → Bean…...

VM虚拟机网络配置(ubuntu24桥接模式):配置静态IP
编辑-虚拟网络编辑器-更改设置 选择桥接模式,然后找到相应的网卡(可以查看自己本机的网络连接) windows连接的网络点击查看属性 编辑虚拟机设置更改网络配置,选择刚才配置的桥接模式 静态ip设置: 我用的ubuntu24桌…...

C++:多态机制详解
目录 一. 多态的概念 1.静态多态(编译时多态) 二.动态多态的定义及实现 1.多态的构成条件 2.虚函数 3.虚函数的重写/覆盖 4.虚函数重写的一些其他问题 1).协变 2).析构函数的重写 5.override 和 final关键字 1&#…...
在鸿蒙HarmonyOS 5中使用DevEco Studio实现企业微信功能
1. 开发环境准备 安装DevEco Studio 3.1: 从华为开发者官网下载最新版DevEco Studio安装HarmonyOS 5.0 SDK 项目配置: // module.json5 {"module": {"requestPermissions": [{"name": "ohos.permis…...

脑机新手指南(七):OpenBCI_GUI:从环境搭建到数据可视化(上)
一、OpenBCI_GUI 项目概述 (一)项目背景与目标 OpenBCI 是一个开源的脑电信号采集硬件平台,其配套的 OpenBCI_GUI 则是专为该硬件设计的图形化界面工具。对于研究人员、开发者和学生而言,首次接触 OpenBCI 设备时,往…...