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

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

王林
Freigeben: 2024-02-09 13:15:28
nach vorne
527 Leute haben es durchsucht

无法停止 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")
})
Nach dem Login kopieren

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

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!

Verwandte Etiketten:
Quelle:stackoverflow.com
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
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage