Heim  >  Artikel  >  Backend-Entwicklung  >  Die Middleware-Kette in Go/Gin konnte nicht gestoppt werden

Die Middleware-Kette in Go/Gin konnte nicht gestoppt werden

王林
王林nach vorne
2024-02-09 13:15:28501Durchsuche

无法停止 Go/Gin 中的中间件链

In der Welt von PHP ist die Middleware-Kette ein gängiges Entwicklungsmodell, das uns bei der Bearbeitung von Anfragen, der Durchführung von Überprüfungen und Autorisierungen usw. helfen kann. Allerdings funktioniert die Middleware-Kette in Gin, dem Go-Web-Framework, etwas anders. Es verwendet eine unaufhaltsame Middleware-Kette, das heißt, jede Middleware wird unabhängig davon ausgeführt, ob in der vorherigen Middleware ein Fehler vorliegt. Obwohl dieses Design die Komplexität des Codes erhöht, bietet es auch eine größere Flexibilität und Anpassbarkeit. In diesem Artikel erhalten Sie eine detaillierte Einführung in das Funktionsprinzip und die Verwendung der Middleware-Kette im Gin-Framework des PHP-Editors Apple.

Frageninhalt

Ich möchte die Sitzung überprüfen, bevor ich mit der Anfrage fortfahre, und ich habe eine Middleware, um die Sitzung zu überprüfen. Das ist der Endpunkt:

profile.use(session.checksession())
profile.get("/:pid", func(c *gin.context) {
    fmt.println("hit :pid")
    c.file("../../html/profile.html")
})

Das ist checksession() Middleware, der Wert ist ein Platzhalter atm:

func CheckSession() gin.HandlerFunc {
    return func(c *gin.Context) {
        session := sessions.Default(c)
        userID := session.Get("user_id")
        firstName := session.Get("firstname")
        lastName := session.Get("lastname")

        if userID == nil || firstName == nil || lastName == nil {
            fmt.Println("No session")
            c.Redirect(http.StatusSeeOther, "/sign-in")
            return
        }

        fmt.Println("Hit c.Next()")
        c.Next()
    }
}

Protokoll:

Zuerst klicke ich auf "/" 路由,该路由重定向到 /profile/:pid 端点,该端点在“无效”会话的情况下重定向到 /sign-in 端点。我被重新路由到 /sign-in 端点,但 /profile/:pid 端点仍然完成执行,即使没有点击 c.next()

Habe versucht, sie einzufügen if-else 块中,以确保仅 c.redirect()c.next() Einer von ihnen wird ausgeführt und es passiert, aber die Funktion wird immer noch ausgeführt und die Kette stoppt nicht

Problemumgehung

Der Fehler wird dadurch verursacht, dass die Middleware-Kette nicht manuell abgebrochen wird. c.Redirect() 不会停止中间件链,您应该手动调用 c.Abort() um die Ausführung der verbleibenden Handler zu verhindern.

c.Abort() Tooltipp:

Abort verhindert, dass ausstehende Handler aufgerufen werden. Beachten Sie, dass dadurch der aktuelle Handler nicht gestoppt wird. Nehmen wir an, Sie verfügen über eine Autorisierungs-Middleware, die überprüft, ob die aktuelle Anfrage autorisiert ist. Wenn die Autorisierung fehlschlägt (zum Beispiel: Kennwort stimmt nicht überein), rufen Sie „Abort“ auf, um sicherzustellen, dass die verbleibenden Handler für diese Anforderung nicht aufgerufen werden.

Das obige ist der detaillierte Inhalt vonDie Middleware-Kette in Go/Gin konnte nicht gestoppt werden. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:stackoverflow.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen