首页 > 其他分享 >gin-中间件实现

gin-中间件实现

时间:2022-10-25 16:11:53浏览次数:41  
标签:Use 实现 中间件 authorized func router gin

1. 无中间件启动

#使用
r := gin.New()
#替代
// 默认启动方式,包含 Logger、Recovery 中间件
r := gin.Default()

2. 中间件启动

func main() {
    // 创建一个不包含中间件的路由器
    r := gin.New()

    // 全局中间件
    // 使用 Logger 中间件
    r.Use(gin.Logger())

    // 使用 Recovery 中间件
    r.Use(gin.Recovery())

    // 路由添加中间件,可以添加任意多个
    r.GET("/benchmark", MyBenchLogger(), benchEndpoint)

    // 路由组中添加中间件
    // authorized := r.Group("/", AuthRequired())
    // exactly the same as:
    authorized := r.Group("/")
    // per group middleware! in this case we use the custom created
    // AuthRequired() middleware just in the "authorized" group.
    authorized.Use(AuthRequired())
    {
        authorized.POST("/login", loginEndpoint)
        authorized.POST("/submit", submitEndpoint)
        authorized.POST("/read", readEndpoint)

        // nested group
        testing := authorized.Group("testing")
        testing.GET("/analytics", analyticsEndpoint)
    }

    // Listen and serve on 0.0.0.0:8080
    r.Run(":8080")
}

  

3. 自定义组件

 
package main

import (
	"fmt"
	"github.com/gin-gonic/gin"
	"net/http"
	"time"
)

func MyLogger() gin.HandlerFunc {
	return func(c *gin.Context) {
		t := time.Now()
		c.Set("example", "123456")
		//让原本改执行的逻辑继续执行
		c.Next()

		end := time.Since(t)
		fmt.Printf("耗时:%V\n", end)
		status := c.Writer.Status()
		fmt.Println("状态", status)
	}
}

func TokenRequired() gin.HandlerFunc {
	return func(c *gin.Context) {
		var token string
		for k, v := range c.Request.Header {
			if k == "X-Token" {
				token = v[0]
			} else {
				fmt.Println(k, v)
			}
		}

		if token != "bobby" {
			c.JSON(http.StatusUnauthorized, gin.H{
				"msg": "未登录",
			})
			//挑战 为什么连return都阻止不了后续逻辑的执行
			c.Abort()
		}
		c.Next()
	}
}

func main() {

	router := gin.Default()
	//使用logger和recovery中间件 全局所有
	router.Use(MyLogger())

	router.GET("/logger", func(c *gin.Context) {
		c.JSON(http.StatusOK, gin.H{
			"message": "logger",
		})
	})

	router.Run(":8083")

	//router := gin.Default()
	////使用logger和recovery中间件 全局所有
	//router.Use(TokenRequired())
	//
	//router.GET("/ping", func(c *gin.Context) {
	//	c.JSON(http.StatusOK, gin.H{
	//		"message": "pong",
	//	})
	//})
	//
	//router.Run(":8083")
}

  

 

标签:Use,实现,中间件,authorized,func,router,gin
From: https://www.cnblogs.com/wlike/p/16825230.html

相关文章