Heim> häufiges Problem> Hauptteil

Welche Rolle spielt Golang-Middleware?

尊渡假赌尊渡假赌尊渡假赌
Freigeben: 2023-05-26 11:03:35
Original
2196 Leute haben es durchsucht

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.

Welche Rolle spielt Golang-Middleware?

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 }
Nach dem Login kopieren

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 }
Nach dem Login kopieren

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) } }
Nach dem Login kopieren
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) }
Nach dem Login kopieren
CrosMiddleware 对uri的非参数部分调用checkSign
Nach dem Login kopieren

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!

Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn