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

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

王林
王林avant
2024-02-09 13:15:28500parcourir

无法停止 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")
})

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()
    }
}

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!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer