Rumah >pembangunan bahagian belakang >Golang >Adakah mungkin untuk membungkus http.ServeHttp dalam go untuk menambah sesi menggunakan alexedwards/scs/v2
Helo, editor php Zimo! Mengenai soalan anda tentang membungkus http.ServeHTTP dalam Pergi untuk menambah sesi menggunakan alexedwards/scs/v2, jawapannya adalah ya. Anda boleh menggunakan perpustakaan alexedwards/scs/v2 untuk mengurus sesi dan membungkus http.ServeHTTP dalam kod Go anda. Dengan cara ini anda boleh menambah keupayaan pengurusan sesi untuk menggunakan sesi dalam aplikasi anda apabila mengendalikan permintaan HTTP. Dengan cara ini anda boleh menambahkan pengesahan, kebenaran dan fungsi berkaitan sesi lain dengan mudah pada aplikasi anda. Harap jawapan ini membantu anda!
Saya cuba menambah sesi pada pelayan http sedia ada yang ditulis dalam go. Saya mempunyai kod berikut
type httpserver struct { getroutes map[string]http.handlerfunc // pattern => handler postroutes map[string]http.handlerfunc server http.server } func (s *httpserver) run() { address := "127.0.0.1:8080" s.server = http.server{ addr: address, handler: s, readtimeout: 10 * time.second, writetimeout: 10 * time.second, maxheaderbytes: 1 << 20, } log.fatal(s.server.listenandserve()) } func (s *httpserver) servehttp(writer http.responsewriter, r *http.request) { ... }
Saya nak guna add session https://pkg.go.dev/github.com/alexedwards/scs/v2#sessionmanager.loadandsave
Kod contoh dalam pautan ialah
mux := http.NewServeMux() mux.HandleFunc("/put", putHandler) mux.HandleFunc("/get", getHandler) // Wrap your handlers with the LoadAndSave() middleware. http.ListenAndServe(":4000", sessionManager.LoadAndSave(mux))
Kod contoh menghantar mux ke loadandsave dan kemudian menyerahkan pengendali baharu ke http.listenandserve(port, newhandler). Dalam kes saya, pengendali datang daripada kaedah servehttp yang saya tambahkan pada struktur *httpserver. Pengendali dalam contoh berasal dari pemultipleks.
Saya baru di sini. Adakah mungkin untuk lulus kaedah servehttp saya untuk memuatkan dan menggunakan pengendali yang dikembalikan daripada loadandsave? Jika tidak, adakah terdapat cara untuk menghantar medan struct http.server yang digunakan dalam contoh saya ke http.listenandserve(port, handler) ?
Sama seperti peter's func (s *httpserver) run(sessionmanager *scs.sessionmanager) {
alamat := "127.0.0.1:8080"
// bungkus httpserver anda dengan loadansave middleware.
handlerwithsessions := sessionmanager.loadandsave(s)
...
}
Ini bermakna mencipta dan mengkonfigurasi Contohnya: sessionmanager
di luar kaedah ini (menggunakan scs. new( )sessionmanager
(使用 scs.new()),并在调用 run
), dan dihantar masuk apabila memanggil run
.
Di sana anda boleh meletakkan sessionmanager
设置为 httpserver
medan dalam struktur.
Ini akan membolehkan (s *httpserver) servehttp(writer http.responsewriter, r *http.request)
anda mendapatkannya semula. package main
import (
"github.com/alexedwards/scs/v2"
"log"
"net/http"
"time"
)
type HttpServer struct {
getRoutes map[string]http.HandlerFunc // pattern => handler
postRoutes map[string]http.HandlerFunc
server http.Server
sessionManager *scs.SessionManager
}
func (s *HttpServer) Run(sessionManager *scs.SessionManager) {
address := "127.0.0.1:8080"
// Set the sessionManager field
s.sessionManager = sessionManager
// Wrap your HttpServer with the LoadAndSave middleware.
handlerWithSessions := sessionManager.LoadAndSave(s)
s.server = http.Server{
Addr: address,
Handler: handlerWithSessions, // Use the wrapped handler
ReadTimeout: 10 * time.Second,
WriteTimeout: 10 * time.Second,
MaxHeaderBytes: 1 << 20,
}
log.Fatal(s.server.ListenAndServe())
}
func (s *HttpServer) ServeHTTP(writer http.ResponseWriter, r *http.Request) {
// Access the session via the sessionManager field
session := s.sessionManager.Load(r)
// Use the session, e.g. session.Put, session.Get, etc.
// ...
}
func main() {
// Create and configure the session manager
sessionManager := scs.New()
sessionManager.Lifetime = 24 * time.Hour
// Create your custom HttpServer
httpServer := &HttpServer{
getRoutes: make(map[string]http.HandlerFunc),
postRoutes: make(map[string]http.HandlerFunc),
}
// Start the server with the session manager
httpServer.Run(sessionManager)
}
Atas ialah kandungan terperinci Adakah mungkin untuk membungkus http.ServeHttp dalam go untuk menambah sesi menggunakan alexedwards/scs/v2. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!