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、项目中安装
redisgithub.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中注册redispackage 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ÿ…...
Swagger Skills:让OpenAPI文档活起来,实现自动化契约测试与场景编排
1. 项目概述:一个为Swagger API文档注入“技能”的利器如果你是一名后端开发者,或者经常需要与API打交道,那么Swagger(现在更常被称为OpenAPI)对你来说一定不陌生。它通过一个标准的YAML或JSON文件,清晰地描…...
观察在虚拟机内使用Taotoken调用API的延迟与稳定性表现
🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 观察在虚拟机内使用Taotoken调用API的延迟与稳定性表现 在开发与测试环境中,虚拟机(VM)是常见的…...
从Solyndra事件看美国太阳能产业转型与能源创新体系构建
1. 从Solyndra事件看美国太阳能产业的十字路口2011年秋天,加州弗里蒙特市,一家名为Solyndra的太阳能公司大门前,联邦官员正将一箱箱文件搬上卡车,而当地几乎所有的电视台摄像机都记录下了这一幕。这家曾获得美国能源部5.35亿美元贷…...
告别300MB限制!用ZotFile插件+坚果云,打造你的免费Zotero文献同步方案
告别300MB限制!用ZotFile插件坚果云打造高效文献同步方案 在学术研究的日常中,文献管理工具Zotero无疑是许多人的得力助手。然而,免费账户仅有的300MB存储空间,对于需要处理大量PDF文献的研究者来说,往往显得捉襟见肘。…...
Windows安卓应用安装器:终极免费方案,3分钟搞定电脑运行安卓应用!
Windows安卓应用安装器:终极免费方案,3分钟搞定电脑运行安卓应用! 【免费下载链接】APK-Installer An Android Application Installer for Windows 项目地址: https://gitcode.com/GitHub_Trending/ap/APK-Installer 你是否曾经遇到过…...
台湾科技产业“小即是美”模式:从半导体到AI的敏捷创新网络构建
1. 从“小”处着眼:台湾科技产业的独特优势解析“台湾是个小岛。”这句话,我在与许多台湾科技业同仁交流时,常常听到。初听之下,这像是一种自谦,甚至带着些许对市场规模和地理局限的无奈。但深入接触后你会发现&#x…...
【Twitter算法适配型Prompt库】:2024Q2官方推荐权重结构解析+ChatGPT生成内容通过率提升67%的12个黄金句式
更多请点击: https://intelliparadigm.com 第一章:Twitter算法适配型Prompt库的演进逻辑与2024Q2权重变革本质 算法信号层重构驱动Prompt范式迁移 2024年第二季度,X(原Twitter)平台正式将Engagement Velocity Ratio&…...
iPad协议开发老哥的避坑指南
兄弟们,在微信私域开发这条路上摸爬滚打了好几年,试过各种方案踩过无数坑,今天终于能给大家分享一个真正用着顺手、技术扎实的「宝藏工具」了——wechatapi 的 iPad 协议接口。作为过来人,真心想把这份「避坑指南」和开发经验掏心…...
2026各个行业可以考的资格经济学专业证书
2026年经济学专业必考高含金量证书指南:CDA数据分析师领衔在数字经济时代,经济学专业人才需通过权威证书提升竞争力。2026年,数据分析、金融、审计等领域的资格证书将成为职业发展的关键筹码。本文将重点解析CDA数据分析师等热门证书的报考条…...
Latte文本到视频生成实战:打造个性化AI视频的终极指南
Latte文本到视频生成实战:打造个性化AI视频的终极指南 【免费下载链接】Latte [TMLR 2025] Latte: Latent Diffusion Transformer for Video Generation. 项目地址: https://gitcode.com/gh_mirrors/la/Latte Latte是一款基于TMLR 2025研究成果的文本到视频…...
