Heim  >  Artikel  >  Welche Rolle spielt Golang-Middleware?

Welche Rolle spielt Golang-Middleware?

尊渡假赌尊渡假赌尊渡假赌
尊渡假赌尊渡假赌尊渡假赌Original
2023-05-26 11:03:352228Durchsuche

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
}

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!

Stellungnahme:
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