Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Tidak dapat menghentikan rantaian middleware dalam Go/Gin

Tidak dapat menghentikan rantaian middleware dalam Go/Gin

王林
王林ke hadapan
2024-02-09 13:15:28500semak imbas

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

Dalam dunia PHP, rantaian perisian tengah ialah model pembangunan biasa, yang boleh membantu kami memproses permintaan, melaksanakan pengesahan dan kebenaran, dsb. Walau bagaimanapun, dalam Gin, rangka kerja web Go, rantaian middleware beroperasi sedikit berbeza. Ia menggunakan rantaian middleware yang tidak boleh dihalang, iaitu setiap middleware akan dilaksanakan tanpa mengira sama ada terdapat ralat dalam middleware sebelumnya. Walaupun reka bentuk ini meningkatkan kerumitan kod, ia juga memberikan fleksibiliti dan kebolehsesuaian yang lebih besar. Artikel ini akan memberi anda pengenalan terperinci kepada prinsip kerja dan penggunaan rantaian middleware dalam rangka kerja Gin oleh editor PHP Apple.

Kandungan soalan

Saya ingin menyemak sesi sebelum meneruskan permintaan dan saya mempunyai perisian tengah untuk menyemak sesi. Inilah titik akhir:

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

Ini ialah checksession() middleware, nilainya ialah atm pemegang tempat:

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:

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

Cuba memasukkannya if-else 块中,以确保仅 c.redirect()c.next() Salah satunya sedang melaksanakan dan ia berlaku, tetapi fungsi masih berlalu dan rantai tidak berhenti

Penyelesaian

Ralat disebabkan oleh tidak membatalkan rantaian middleware secara manual. c.Redirect() 不会停止中间件链,您应该手动调用 c.Abort() untuk mengelakkan pelaksanaan pengendali yang tinggal.

c.Abort() Petua alat:

Abort menghalang pengendali yang belum selesai dipanggil. Ambil perhatian bahawa ini tidak menghalang pengendali semasa. Katakan anda mempunyai perisian tengah keizinan yang mengesahkan bahawa permintaan semasa dibenarkan. Jika kebenaran gagal (contohnya: kata laluan tidak sepadan), hubungi Batalkan untuk memastikan bahawa pengendali yang tinggal untuk permintaan ini tidak dipanggil.

Atas ialah kandungan terperinci Tidak dapat menghentikan rantaian middleware dalam Go/Gin. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Artikel ini dikembalikan pada:stackoverflow.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam