Heim häufiges Problem Welche Rolle spielt Golang-Middleware?

Welche Rolle spielt Golang-Middleware?

May 26, 2023 am 11:03 AM
golang 中间件

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!

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

Heiße KI -Werkzeuge

Undresser.AI Undress

Undresser.AI Undress

KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover

AI Clothes Remover

Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool

Undress AI Tool

Ausziehbilder kostenlos

Clothoff.io

Clothoff.io

KI-Kleiderentferner

AI Hentai Generator

AI Hentai Generator

Erstellen Sie kostenlos Ai Hentai.

Heißer Artikel

R.E.P.O. Energiekristalle erklärten und was sie tun (gelber Kristall)
4 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Beste grafische Einstellungen
4 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. So reparieren Sie Audio, wenn Sie niemanden hören können
4 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25: Wie man alles in Myrise freischaltet
1 Monate vor By 尊渡假赌尊渡假赌尊渡假赌

Heiße Werkzeuge

Notepad++7.3.1

Notepad++7.3.1

Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version

SublimeText3 chinesische Version

Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1

Senden Sie Studio 13.0.1

Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6

Dreamweaver CS6

Visuelle Webentwicklungstools

SublimeText3 Mac-Version

SublimeText3 Mac-Version

Codebearbeitungssoftware auf Gottesniveau (SublimeText3)