Home  >  Article  >  Backend Development  >  Unable to stop middleware chain in Go/Gin

Unable to stop middleware chain in Go/Gin

王林
王林forward
2024-02-09 13:15:28501browse

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

In the PHP world, middleware chain is a common development model, which can help us process requests, perform verification and authorization operations, etc. However, in Gin, the Go web framework, the middleware chain operates a little differently. It uses an unstoppable middleware chain, that is, each middleware will be executed regardless of whether there is an error in the previous middleware. Although this design increases the complexity of the code, it also provides greater flexibility and customizability. This article will give you a detailed introduction to the working principle and usage of the middleware chain in the Gin framework by PHP editor Apple.

Question content

I want to check the session before proceeding with the request, and I have a middleware to check the session. This is the endpoint:

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

This is checksession() middleware, the value is a placeholder 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()
    }
}

log:

First, I hit the "/" route, which redirects to the /profile/:pid endpoint, which redirects to # in case of an "invalid" session ##/sign-in Endpoint. I'm being rerouted to the /sign-in endpoint, but the /profile/:pid endpoint still completes execution even without clicking c.next()

Try putting them in a

if-else block to ensure that only one of c.redirect() and c.next() is executing , and is happening, but the function still passes and the chain is not stopped.

Workaround

The error is caused by not manually aborting the middleware chain.

c.Redirect() does not stop the middleware chain, you should manually call c.Abort() to prevent the remaining handlers from executing.

c.Abort() Tool tip:

Abort prevents pending handlers from being called. Note that this does not stop the current handler. Let's say you have an authorization middleware that verifies that the current request is authorized. If authorization fails (for example: password mismatch), call Abort to ensure that the remaining handlers for this request are not called.

The above is the detailed content of Unable to stop middleware chain in Go/Gin. For more information, please follow other related articles on the PHP Chinese website!

Statement:
This article is reproduced at:stackoverflow.com. If there is any infringement, please contact admin@php.cn delete