Tidak dapat menghentikan rantaian middleware dalam Go/Gin

王林
Lepaskan: 2024-02-09 13:15:28
ke hadapan
500 orang telah melayarinya

无法停止 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")
})
Salin selepas log masuk

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()
    }
}
Salin selepas log masuk

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!

Label berkaitan:
sumber:stackoverflow.com
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!