Golang ミドルウェアの役割はプラグイン可能で自己完結型であり、その機能は次のとおりです: 1. リクエストを処理するプロセスで、リクエストをインターセプト、処理、またはフィルタリングし、リクエストの処理の前後にいくつかの操作を実行できます。 2. ミドルウェアは、コード構造内のビジネス ロジックと処理リクエストを分離できるため、コードがより明確になり、保守が容易になります。 3. ミドルウェアが再利用できるため、システムの負荷が軽減されます。繰り返しコードを書く。
Golang ミドルウェアの役割
ミドルウェアの主な責任は、プラグイン可能で自己完結型であることです。リクエストの処理プロセス中に、リクエストはインターセプト、処理、またはフィルタリングされ、ログ記録、認証、リクエスト パラメータの処理などの一部の操作はリクエストの処理の前後に実行できます。ミドルウェアは、コード構造内でビジネス ロジックとリクエスト処理を分離できるため、コードがより明確になり、保守が容易になります。同時にミドルウェアを再利用できるため、繰り返しコードを記述する作業負荷が軽減されます。 コード例は次のとおりです。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 }ハンドルはいつ呼び出されますか? 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 }このコードを通して、BaseMiddleware が実際にはリンク リストを形成するノード ミドルウェアのリンク リストであることがわかります。グループ ミドルウェアや通常のミドルウェアなどのタイプは、ctx の現在の処理ステップに基づいてどのミドルウェアを呼び出すかを決定し、最終的に ctx のハンドラーを呼び出します。カスタム ミドルウェアは BaseMiddleware を継承して実装する必要があります。ハンドル
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) } }この方法で、受信コンテックスを解析できますブログサーバーで使用されるミドルウェアを分析します:CrosMiddleware
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
//验证签名 (requestUri(不含query)+secret) func checkSign(sign, uri string) bool { result := utils.Md5(uri + config.Config().SecretKey) return result == sign }渡されたヘッダー 符号値内部は URI 設定ファイルの SecretKey md5 と一致している必要があります
以上がgolangミドルウェアの役割は何ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。