Maison > développement back-end > Golang > Impossible d'arrêter la chaîne middleware dans Go/Gin

Impossible d'arrêter la chaîne middleware dans Go/Gin

王林
Libérer: 2024-02-09 13:15:28
avant
529 Les gens l'ont consulté

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

Dans le monde de PHP, la chaîne middleware est un modèle de développement courant, qui peut nous aider à traiter les demandes, à effectuer des vérifications et des autorisations, etc. Cependant, dans Gin, le framework web Go, la chaîne middleware fonctionne un peu différemment. Il utilise une chaîne de middleware imparable, c'est-à-dire que chaque middleware sera exécuté indépendamment du fait qu'il y ait ou non une erreur dans le middleware précédent. Bien que cette conception augmente la complexité du code, elle offre également une plus grande flexibilité et personnalisation. Cet article vous donnera une introduction détaillée au principe de fonctionnement et à l'utilisation de la chaîne middleware dans le framework Gin par l'éditeur PHP Apple.

Contenu de la question

Je souhaite vérifier la session avant de procéder à la demande et j'ai un middleware pour vérifier la session. C'est le point final :

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

Il s'agit d'un checksession() middleware, la valeur est un espace réservé 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()
    }
}
Copier après la connexion

Journal :

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

J'ai essayé de les insérer if-else 块中,以确保仅 c.redirect()c.next() L'un d'eux est en cours d'exécution et cela se produit, mais la fonction passe toujours et la chaîne ne s'arrête pas

Solution de contournement

L'erreur est causée par le fait de ne pas abandonner manuellement la chaîne de middleware. c.Redirect() 不会停止中间件链,您应该手动调用 c.Abort() pour empêcher l'exécution des gestionnaires restants.

c.Abort() Astuce :

Abort empêche l'appel des gestionnaires en attente. Notez que cela n'arrête pas le gestionnaire actuel. Supposons que vous disposiez d'un middleware d'autorisation qui vérifie que la demande actuelle est autorisée. Si l'autorisation échoue (par exemple : incompatibilité de mot de passe), appelez Abort pour vous assurer que les gestionnaires restants de cette demande ne sont pas appelés.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Étiquettes associées:
source:stackoverflow.com
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal