Dalam senario ini, anda menggunakan perisian tengah yang menghuraikan JWT daripada badan permintaan dan ingin menghantarnya kepada pengendali anda untuk mengelakkan penghuraian berlebihan. Memandangkan middleware anda mengembalikan http.Handler dan pengendali anda juga mengembalikan http.Handler, anda perlu mencari jalan untuk melepasi JWT antara mereka.
Satu pendekatan yang disyorkan ialah menggunakan pakej konteks daripada Gorilla Mux. Pakej konteks membolehkan anda menyimpan nilai yang dikaitkan dengan permintaan dalam cara yang selamat jenis.
import ( "github.com/gorilla/context" ) // Middleware serves as a wrapper around the next handler. func Middleware(next http.Handler) http.Handler { return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { // Middleware operations // Parse body/get token. token, err := getTokenFromRequest(r) if err != nil { http.Error(w, "Error getting token", http.StatusInternalServerError) return } context.Set(r, "token", token) next.ServeHTTP(w, r) }) } // Handler retrieves the JWT from the request context. func Handler() http.Handler { return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { token := context.Get(r, "token") // Use the token in your handler logic. }) }
Dengan menggunakan pakej konteks, anda boleh menyimpan JWT yang dihuraikan dalam konteks permintaan dalam perisian tengah dan mengakses dengan mudah ia dalam pengendali anda tanpa perlu menghuraikan semula.
Kemas kini:
Perlu diperhatikan bahawa pakej konteks Gorilla kini dalam mod penyelenggaraan. Untuk projek baharu, adalah disyorkan untuk menggunakan ciri context.Context() yang diperkenalkan dalam Go 1.7, yang menyediakan cara yang lebih mantap dan cekap untuk mengurus data konteks permintaan.
Atas ialah kandungan terperinci Bagaimana untuk Menghantar Data daripada Middleware kepada Pengendali dalam Go?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!