Unable to stop middleware chain in Go/Gin

王林
Release: 2024-02-09 13:15:28
forward
500 people have browsed it

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

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()
    }
}
Copy after login

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!

Related labels:
source:stackoverflow.com
Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template
About us Disclaimer Sitemap
php.cn:Public welfare online PHP training,Help PHP learners grow quickly!