首頁 >後端開發 >Golang >是否可以將 http.ServeHttp 包裝在 go 中以使用 alexedwards/scs/v2 新增會話

是否可以將 http.ServeHttp 包裝在 go 中以使用 alexedwards/scs/v2 新增會話

PHPz
PHPz轉載
2024-02-09 09:30:19637瀏覽

是否可以将 http.ServeHttp 包装在 go 中以使用 alexedwards/scs/v2 添加会话

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) 中?

解決方法

peterfunc (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中文網其他相關文章!

陳述:
本文轉載於:stackoverflow.com。如有侵權,請聯絡admin@php.cn刪除