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)
}
登錄后復制






