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ÿ…...
如何妙用哈希表来优化遍历查找过程?刷题感悟总结,c++实现
先上题目 题目链接:题目链接 这题我最先想到的就是前缀和a,构造好了以后就遍历每一个[l,r]数组(满足题目要求的连续区间数组),奈何倒数第二个样例时间超限 先给出原思路代码 class Solution { public:int subarray…...
【设计模式】漫谈设计模式
这篇文章里说一下对设计模式的个人的理解。本篇文章更类似于随笔而非技术文档。 设计模式最早是在上个世纪就被人提出来了,如今被奉为圣经,也就是GOF等人写的《设计模式》,其中的设计模式,是指导开发者如何进行开发出高内聚、低耦…...
第N5周:Pytorch文本分类入门
本文为365天深度学习训练营 中的学习记录博客原作者:K同学啊 任务: ●1. 了解文本分类的基本流程 ●2. 学习常用数据清洗方法 ●3. 学习如何使用jieba实现英文分词 ●4. 学习如何构建文本向量 一、前期准备 环境安装 这是一个使用PyTorch实现的简单文…...
SpringBoot 自定义 starter
1. 官方文档 SpringBoot 版本 2.6.13,相关链接 Developing with Spring Boot 1.1 什么是 Starter Starters are a set of convenient dependency descriptors that you can include in your application. You get a one-stop shop for all the Spring and relate…...
TDengine Invalid data format 问题定位
Invalid data format 看语义是数据类型不符,通常这个报错出现在使用行协议写入时。 如果是批量数据写入,想定位是哪条语句的问题,需要查看客户端日志。 如何确定使用的是哪个日志 lsof -p pidof taosadapter | grep taoslog如果没有安装lso…...
Spring Boot 使用 MongoDB 教程
🍁 作者:知识浅谈,CSDN签约讲师,CSDN博客专家,华为云云享专家,阿里云专家博主 📌 擅长领域:全栈工程师、爬虫、ACM算法 🔥 微信:zsqtcyw 联系我领取学习资料 …...
Python办公自动化:使用openpyxl 创建与保存 Excel 工作簿
1 创建新的工作簿 在开始任何 Excel 操作之前,首先需要创建一个工作簿。openpyxl 提供了简单的接口来创建新的工作簿。 创建一个空白的工作簿 我们可以使用 openpyxl.Workbook() 来创建一个新的空白工作簿。以下是一个简单的示例: import openpyxl# …...
【张】#11 Union 共用体
Union 共用体可以存储不同的数据类型,但只能同时存储其中的一种类型。 #include <iostream> using namespace std;struct Product {char productName[20];int type;//1 int ,else charunion{int id_int;char id_chars[20];}; };int main(){Product product; …...
Xcode 在原生集成flutter项目
笔者公司有一个从2017年就开始开发的iOS和安卓原生项目,现在计划从外到内开始进行项目迁徙。 1》从gitee拉取flutter端的代码;(Android报错Exception: Podfile missing) 2》替换Xcode里的cocopods里Podfile的路径 然后报警 然后…...
ES6的promise
Promise是什么 1、Promise是js中的一个原生对象,是一种异步编程的解决方案。可以替换掉传统的回调函数解决方案,将异步操作以同步的流程表达出来。 2、Promise有三种状态:pending(初始化)、fulfilled(成功)、rejected(失败) 可以通过resolve(…...
云南网站制作一条龙全包/深圳网络营销推广招聘网
题目大意:给出一些圆,求一个可以将所有圆装下的箱子,输出箱子的长,圆摆放的要求是必须至少与另一个圆相接,并且所有圆必须接触地面。 解题思路:一开始吧这道题想的太简单了,直接用DFS将所有排列…...
少儿美术专业网站做课件/平台推广是做什么
eg: "sdfgzxcvasdfxcvdf"获取该字符串中的字母出现的次数。 希望打印结果:a(1)c(2)..... ---------------------------------------------code--------------------------------------------------------------------- thinking:通过结果发现ÿ…...
网站怎么做sem/网站优化排名金苹果系统
建立一个JDBC应用程序,本教程中以Java连接MySQL为一个示例,分六个步骤进行: 1. 导入包 在程序中包含数据库编程所需的JDBC类。大多数情况下,使用 import java.sql.* 就足够了,如下所示: //STEP 1. Import r…...
软件工程技术学什么/网站性能优化的方法有哪些
效果图 静态图 动态图 代码及详解: 代码很简单,让我们直接来看代码和注释 varying vec2 texcoord;// uniform float iGlobalTime; // uniform vec2 iResolution;...
眉山网站建设/设计网站的软件
这是本系列第19篇文章,至此,Lightroom Classic的面板栏已经讲完了,今天来讲讲直方图与面板栏之间这一小条:工具栏。虽然这里有6个工具 ,但我都放在一篇文章里讲,大家可以快速了解这些工具。这些工具很多与C…...
wordpress分菜单/职业技能培训有哪些
这个帖子里的方法有点过时了,不推荐继续使用。有的时候会碰到这么一种情况,带着电脑和手机出去蹭网,无奈只有一个账号,手机上了电脑就没得用了,电脑用了手机就上不了网。如果能用电脑连接 Wifi 然后再开热点给手机用该…...