• Go Web——Gin使用中间件



    简介

    Gin框架允许开发者在处理请求的过程中,加入用户自己的钩子(Hook)函数。这个钩子函数就叫中间件,中间件适合处理一些公共的业务逻辑,比如登录认证、权限校验、数据分页、记录日志、耗时统计等。

    中间件就是在请求中间起到拦截作用的处理函数。

    Gin默认中间件

    如果你使用Gin.Default()实例化gin引擎,默认有两个中间件,LoggerRecovery,分别用来处理日志和处理错误。如果使用gin.New()需要重新添加。

    // 实例化gin引擎,默认含有 Logger 和 Recovery 中间件
    e := gin.Default()
    
    // 新建一个没有任何默认中间件的路由
    r := gin.New()
    
    // 全局中间件
    // Logger 中间件将日志写入 gin.DefaultWriter,即使你将 GIN_MODE 设置为 release。
    // By default gin.DefaultWriter = os.Stdout
    r.Use(gin.Logger())
    
    // Recovery 中间件会 recover 任何 panic。如果有 panic 的话,会写入 500。
    r.Use(gin.Recovery())
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • Logger中间件将日志写入gin.DefaultWriter,即使配置了GIN_MODE=release
    • Recovery中间件会recover任何panic。如果有panic的话,会写入500响应码。

    自定义中间件

    自定义中间件非常简单,先定义一个符合下面格式的处理函数

    type HandlerFunc func(*Context)
    
    • 1

    再使用Use方法调用

    func (engine *Engine) Use(middleware ...HandlerFunc) IRoutes
    
    • 1

    实例演示:

    package main
    
    import (
    	"fmt"
    
    	"github.com/gin-gonic/gin"
    )
    
    func MiddleWare1(c *gin.Context) {
    	fmt.Println("我的第一个自定义中间件")
    }
    
    func MiddleWare2(c *gin.Context) {
    	fmt.Println("我的第二个自定义中间件")
    }
    
    func main() {
    	e := gin.Default()
    
    	e.Use(MiddleWare1, MiddleWare2)
    
    	e.Run()
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23

    运行结果:

    在这里插入图片描述

    使用BasicAuth中间件

    Gin提供了BasicAuth中间件,用来对网站资源的访问保护。

    通过BasicAuth中间件可以快速实现 http 基础认证,提高应用安全性。

    官方示例:

    package main
    
    import (
    	"net/http"
    
    	"github.com/gin-gonic/gin"
    )
    
    // 模拟一些私人数据
    var secrets = gin.H{
    	"foo":    gin.H{"email": "foo@bar.com", "phone": "123433"},
    	"austin": gin.H{"email": "austin@example.com", "phone": "666"},
    	"lena":   gin.H{"email": "lena@guapa.com", "phone": "523443"},
    }
    
    func main() {
    	r := gin.Default()
    
    	// 路由组使用 gin.BasicAuth() 中间件
    	// gin.Accounts 是 map[string]string 的一种快捷方式
    	authorized := r.Group("/admin", gin.BasicAuth(gin.Accounts{
    		"foo":    "bar",
    		"austin": "1234",
    		"lena":   "hello2",
    		"manu":   "4321",
    	}))
    
    	// /admin/secrets 端点
    	// 触发 "localhost:8080/admin/secrets
    	authorized.GET("/secrets", func(c *gin.Context) {
    		// 获取用户,它是由 BasicAuth 中间件设置的
    		user := c.MustGet(gin.AuthUserKey).(string)
    		if secret, ok := secrets[user]; ok {
    			c.JSON(http.StatusOK, gin.H{"user": user, "secret": secret})
    		} else {
    			c.JSON(http.StatusOK, gin.H{"user": user, "secret": "NO SECRET :("})
    		}
    	})
    
    	// 监听并在 0.0.0.0:8080 上启动服务
    	// http://localhost:8080/admin/secrets
    	r.Run(":8080")
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43

    在浏览器输入:localhost:8080/admin/secrets会弹出对话框,要求输入正确的用户名和密码才能访问资源

    在这里插入图片描述

  • 相关阅读:
    K8S安装过程八:Kubernetes Master 节点安装
    YoloV8改进策略:SwiftFormer,全网首发,独家改进的高效加性注意力用于实时移动视觉应用的模型,重构YoloV8
    Dremio:新一代数据湖仓引擎
    通达OA V12版本,好用的自定义函数
    第18章、探讨C++新标准
    2023年【金属非金属矿山(地下矿山)安全管理人员】考试题库及金属非金属矿山(地下矿山)安全管理人员模拟考试题
    安全防御2
    HCIA-Access V2.5 华为认证接入网络工程师学习笔记第二章
    java单例模式
    SparkCore算子及案例,220719,
  • 原文地址:https://blog.csdn.net/qq_39280718/article/details/126528449