Die Aufgaben der Golang-Middleware sind steckbar und autark. Ihre Funktionen sind: 1. Bei der Verarbeitung von Anforderungen können Anforderungen abgefangen, verarbeitet oder gefiltert werden, und es können einige Vorgänge vor und nach der Verarbeitung von Anforderungen ausgeführt werden, z. B. Protokollierung und Authentifizierung , Verarbeitung von Anforderungsparametern usw.; 2. Middleware kann Geschäftslogik und Verarbeitungsanforderungen in der Codestruktur trennen, wodurch der Code klarer und einfacher zu verwalten ist. 3. Middleware kann wiederverwendet werden, wodurch die Code-Arbeitsbelastung verringert wird.
Die Betriebsumgebung dieses Tutorials: Windows 10-System, GO-Version 1.20.1, Dell G3-Computer.
Die Rolle der Golang-Middleware
Die Hauptaufgabe der Middleware besteht darin, steckbar und autark zu sein. Während der Verarbeitung der Anforderung wird die Anforderung abgefangen, verarbeitet oder gefiltert, und einige Vorgänge können vor und nach der Verarbeitung der Anforderung ausgeführt werden, z. B. Protokollierung, Authentifizierung, Verarbeitung von Anforderungsparametern usw. Middleware kann Geschäftslogik und Anforderungsverarbeitung in der Codestruktur trennen, wodurch der Code klarer und einfacher zu warten ist. Gleichzeitig kann die Middleware wiederverwendet werden, wodurch der Arbeitsaufwand für das wiederholte Schreiben von Code verringert wird.
Das Codebeispiel lautet wie folgt:
package main import ( "fmt" "github.com/devfeel/dotweb" ) func main() { app := dotweb.New() // App注册中间件 app.Use(NewSessionAuth()) // 开启SESSION app.HttpServer.SetEnabledSession(true) // 设置路由 输出字符串 Hello Dotweb app.HttpServer.GET("/", func(ctx dotweb.Context) error { method := ctx.Request().Method return ctx.WriteString("Hello Dotweb\n" + "Method:" + method) }) //开启服务 端口号 fmt.Println("dotweb.StartServer => 8080") err := app.StartServer(8080) fmt.Println("dotweb.StartServer error => ", err) } // SessionAuth 结构体 type SessionAuth struct { dotweb.BaseMiddlware } // Handle 处理程序 func (m *SessionAuth) Handle(ctx dotweb.Context) error { fmt.Println("SessionID = ", ctx.SessionID(), " RequestURI = ", ctx.Request().RequestURI) return m.Next(ctx) } // NewSessionAuth New func NewSessionAuth() *SessionAuth { sAuth := new(SessionAuth) return sAu }
Wann wird Handle aufgerufen?
Werfen wir einen Blick auf den Quellcode von BaseMiddlWare:
// BaseMiddleware is the base struct, user defined middleware should extend this type BaseMiddleware struct { next Middleware excludeRouters map[string]struct{} } func (bm *BaseMiddleware) SetNext(m Middleware) { bm.next = m } func (bm *BaseMiddleware) Next(ctx Context) error { httpCtx := ctx.(*HttpContext) if httpCtx.middlewareStep == "" { httpCtx.middlewareStep = middleware_App } if bm.next == nil { if httpCtx.middlewareStep == middleware_App { httpCtx.middlewareStep = middleware_Group if len(httpCtx.RouterNode().GroupMiddlewares()) > 0 { return httpCtx.RouterNode().GroupMiddlewares()[0].Handle(ctx) } } if httpCtx.middlewareStep == middleware_Group { httpCtx.middlewareStep = middleware_Router if len(httpCtx.RouterNode().Middlewares()) > 0 { return httpCtx.RouterNode().Middlewares()[0].Handle(ctx) } } if httpCtx.middlewareStep == middleware_Router { return httpCtx.Handler()(ctx) } } else { // check exclude config if ctx.RouterNode().Node().hasExcludeMiddleware && bm.next.HasExclude() { if bm.next.ExistsExcludeRouter(ctx.RouterNode().Node().fullPath) { return bm.next.Next(ctx) } } return bm.next.Handle(ctx) } return n }
Anhand dieses Codes können wir wahrscheinlich erkennen, dass BaseMiddleware tatsächlich eine verknüpfte Liste von Knoten-Middlewares ist, die eine verknüpfte Liste bilden, und es gibt verschiedene Typen, einschließlich Gruppen-Middleware und gewöhnlicher Middleware Middleware. Bestimmen Sie basierend auf dem aktuellen Verarbeitungsschritt von ctx, welche Middleware aufgerufen werden soll, und rufen Sie schließlich den Handler von ctx auf. Die benutzerdefinierte Middleware muss BaseMiddleware erben und Handle implementieren, damit der eingehende Contex analysiert werden kann Werfen wir einen Blick auf die im Blogserver verwendete Middleware:
CrosMiddleware
func (asm *ApiSignMiddleware) Handle(ctx dotweb.Context) error { if sign := ctx.Request().QueryHeader("Sign"); len(sign) <= 0 { return ctx.WriteJsonC(http.StatusBadRequest, models.Response{Err: common.ErrSignParams, Data: nil}) } else { uri := ctx.Request().RequestURI if index := strings.Index(uri, "?"); index != -1 { uri = uri[:index] } if ok := checkSign(sign, uri); !ok { return ctx.WriteJsonC(http.StatusBadRequest, models.Response{Err: common.ErrSignParams, Data: nil}) } return asm.Next(ctx) } }
func (cm *CrosMiddleware) Handle(ctx dotweb.Context) error { if strings.Contains(ctx.Request().RequestURI, "v1") && ctx.Request().Method != "OPTIONS" { if sign := ctx.Request().QueryHeader("Sign"); len(sign) <= 0 { return ctx.WriteJsonC(http.StatusBadRequest, models.Response{Err: common.ErrSignParams, Data: nil}) } else { uri := ctx.Request().RequestURI if index := strings.Index(uri, "?"); index != -1 { uri = uri[:index] } if ok := checkSign(sign, uri); !ok { return ctx.WriteJsonC(http.StatusBadRequest, models.Response{Err: common.ErrSignParams, Data: nil}) } return cm.Next(ctx) } } return cm.Next(ctx) }
CrosMiddleware 对uri的非参数部分调用checkSign
Der Vorzeichenwert im übergebenen Header sollte mit der URI + dem SecretKey in der Konfigurationsdatei übereinstimmen, nämlich md5
Das obige ist der detaillierte Inhalt vonWelche Rolle spielt Golang-Middleware?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!