Gin(七):中間件的使用和定義

文章首發於 ISLANDjava

中間件 middlewaregolang 中是一個很重要的概念,與 java 中攔截器很類似。經過 gin 源代碼來看看中間件代碼使用。mysql

🎮中間件使用

咱們仍是回到了 initRouterSetupRouter 這個方法。git

router := gin.Default()
複製代碼

咱們的項目是從這一行代碼開始的,因此咱們看看這一行代碼作了些什麼。打開 Default 源碼,github

func Default() *Engine {
	debugPrintWARNINGDefault()
	engine := New()
	engine.Use(Logger(), Recovery())
	return engine
}
複製代碼

源碼中,首先是 New 了一個 engine ,緊接着經過 Use 方法,傳入了 Logger()Recovery() ,而 LoggerRecovery 就是兩個中間件。golang

其中 Logger 是對日誌進行記錄,而 Recovery 是對有 painc時, 進行 500 的錯誤處理sql

查看了源碼以後,那麼咱們也就知道如何使用中間件了。cookie

📝自定義一箇中間件

中間件須要返回 gin.HandlerFunc 函數,因此定義返回函數。函數

並且 中間件有個 Next 函數,在咱們定義的衆多中間件,會造成一條中間件鏈,而經過 Next 函數來對後面的中間件進行執行。Next 函數是在請求前執行,而 Next 函數後是在請求後執行。ui

咱們來本身定義一個 Logger 日誌,新建一個 middleware 文件夾,裏面新建 Logger.go,進行咱們自定義的日誌展現。url

package middleware

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

func Logger() gin.HandlerFunc {
	return func(context *gin.Context) {
		host := context.Request.Host
		url := context.Request.URL
		method := context.Request.Method
		fmt.Printf("%s::%s \t %s \t %s ", time.Now().Format("2006-01-02 15:04:05"), host, url, method)
		context.Next()
		fmt.Println(context.Writer.Status())
	}
}
複製代碼

全局中間件

修改 initRouter 中的 SetupRouter 方法,將咱們自定義的中間件進行添加。

router := gin.New()
// 添加自定義的 logger 中間件
router.Use(middleware.Logger(), gin.Recovery())
複製代碼

此時從新啓動咱們的項目,訪問localhost:8080端口,控制檯上就會打印出咱們新的格式日誌。

2019-07-23 18:17:58::localhost:8080 / GET 200

固然,此時此刻的 Logger 中間件是全局使用,咱們也能夠給特定的路由進行使用。

局部中間件

好比咱們規定某些路由須要登陸後才能訪問,那麼咱們能夠給這些路由進行受權管理。

咱們從新寫一個 Auth 中間件來進行管理,這裏不具體實現該中間件,後期會實現,這裏只進行展現。

package middleware

import "github.com/gin-gonic/gin"

func Auth() gin.HandlerFunc {
	return func(context *gin.Context) {
		println("已經受權")
		context.Next()
	}
}
複製代碼

咱們在 用戶信息修改和用戶信息展現的路由上進行該中間件的添加。

userRouter.GET("/profile/", middleware.Auth(), handler.UserProfile)
userRouter.POST("/update", middleware.Auth(), handler.UpdateUserProfile)
複製代碼

再次運行項目,當咱們對用戶詳情頁進行訪問的時候,控制檯上會打印出 已經受權 的日誌,而訪問其餘頁面則不會出現,說明咱們的中間件使用成功。

✍總結

經過本次的中間件瞭解,基本掌握了中間件如何編寫和使用,對於全局和局部的兩種中間件也有着不一樣的使用方法和使用範圍。

👩‍💻本章節代碼

Github

📰歷史文章

Gin(一):Hello
Gin(二):路由Router
Gin(三):模板tmpl
Gin(四):表單提交校驗和模型綁定
Gin(五):鏈接MySQL
Gin(六):文件的上傳
Gin(七):中間件的使用和定義 Gin(八):Cookie的使用

我的公衆號

最近剛剛申請了一個公衆號,之後文章會同步發送,歡迎各位大佬關注

相關文章
相關標籤/搜索