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)
}
以上是是否可以將 http.ServeHttp 包裝在 go 中以使用 alexedwards/scs/v2 新增會話的詳細內容。更多資訊請關注PHP中文網其他相關文章!