文章首發於 ISLANDjava
中間件 middleware
在 golang
中是一個很重要的概念,與 java
中攔截器很類似。經過 gin 源代碼來看看中間件代碼使用。mysql
咱們仍是回到了 initRouter
中 SetupRouter
這個方法。git
router := gin.Default()
複製代碼
咱們的項目是從這一行代碼開始的,因此咱們看看這一行代碼作了些什麼。打開 Default
源碼,github
func Default() *Engine {
debugPrintWARNINGDefault()
engine := New()
engine.Use(Logger(), Recovery())
return engine
}
複製代碼
源碼中,首先是 New
了一個 engine
,緊接着經過 Use
方法,傳入了 Logger()
和 Recovery()
,而 Logger
和 Recovery
就是兩個中間件。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)
複製代碼
再次運行項目,當咱們對用戶詳情頁進行訪問的時候,控制檯上會打印出 已經受權 的日誌,而訪問其餘頁面則不會出現,說明咱們的中間件使用成功。
經過本次的中間件瞭解,基本掌握了中間件如何編寫和使用,對於全局和局部的兩種中間件也有着不一樣的使用方法和使用範圍。
Gin(一):Hello
Gin(二):路由Router
Gin(三):模板tmpl
Gin(四):表單提交校驗和模型綁定
Gin(五):鏈接MySQL
Gin(六):文件的上傳
Gin(七):中間件的使用和定義 Gin(八):Cookie的使用
最近剛剛申請了一個公衆號,之後文章會同步發送,歡迎各位大佬關注