php小編子墨你好!關于將http.ServeHTTP包裝在Go中以使用alexedwards/scs/v2添加會話的問題,答案是肯定的。你可以使用alexedwards/scs/v2這個庫來管理會話,而將http.ServeHTTP包裝在你的Go代碼中。這樣,你就可以在處理HTTP請求時添加會話管理功能,以便在應用程序中使用會話。通過這種方式,你可以輕松地為你的應用程序添加身份驗證、授權和其他會話相關的功能。希望這個回答對你有幫助!
問題內容
我正在嘗試將會話添加到用 go 編寫的現有 http 服務器。我有如下代碼
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) { ... }
登錄后復制
我想使用添加會話
https://pkg.go.dev/github.com/alexedwards/scs/v2#sessionmanager.loadandsave
鏈接中的示例代碼是
mux := http.NewServeMux() mux.HandleFunc("/put", putHandler) mux.HandleFunc("/get", getHandler) // Wrap your handlers with the LoadAndSave() middleware. http.ListenAndServe(":4000", sessionManager.LoadAndSave(mux))
登錄后復制
示例代碼將 mux 傳遞到 loadandsave,然后將新處理程序傳遞到 http.listenandserve(port, newhandler)。就我而言,處理程序來自我添加到 *httpserver 結構中的 servehttp 方法。示例中的處理程序來自多路復用器。
我是新來的。是否可以將我的 servehttp 方法傳遞到 loadandsave 并使用從 loadandsave 返回的處理程序?如果沒有,有沒有辦法將我的示例中使用的 http.server 結構字段傳遞到 http.listenandserve(port, handler) 中?
解決方法
正如 peter 的 func (s *httpserver) run(sessionmanager *scs.sessionmanager) {
address := “127.0.0.1:8080”
// wrap your httpserver with the loadandsave middleware.
handlerwithsessions := sessionmanager.loadandsave(s)
…
}
這意味著在此方法之外創建和配置 sessionmanager
(使用 scs.new()),并在調用 run
時傳入。
在那里,您可以將 sessionmanager
設置為 httpserver
結構中的字段。
這將允許您的 (s *httpserver) servehttp(writer http.responsewriter, r *http.request)
檢索它。
例如:
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) }
登錄后復制