Heim >Backend-Entwicklung >Golang >Ist es möglich, http.ServeHttp einzubinden, um eine Sitzung mit alexedwards/scs/v2 hinzuzufügen?

Ist es möglich, http.ServeHttp einzubinden, um eine Sitzung mit alexedwards/scs/v2 hinzuzufügen?

PHPz
PHPznach vorne
2024-02-09 09:30:19635Durchsuche

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

Hallo, PHP-Editor Zimo! Bezüglich Ihrer Frage zum Einschließen von http.ServeHTTP in Go zum Hinzufügen von Sitzungen mit alexedwards/scs/v2 lautet die Antwort „Ja“. Sie können die alexedwards/scs/v2-Bibliothek verwenden, um Sitzungen zu verwalten und http.ServeHTTP in Ihren Go-Code einzubinden. Auf diese Weise können Sie Sitzungsverwaltungsfunktionen hinzufügen, um Sitzungen in Ihrer Anwendung bei der Verarbeitung von HTTP-Anfragen zu verwenden. Auf diese Weise können Sie Ihrer Anwendung problemlos Authentifizierung, Autorisierung und andere sitzungsbezogene Funktionen hinzufügen. Ich hoffe, diese Antwort ist hilfreich für Sie!

Frageninhalt

Ich versuche, Sitzungen zu einem vorhandenen, in go geschriebenen http-Server hinzuzufügen. Ich habe den folgenden Code

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) {
     ...
}

Ich möchte Sitzung hinzufügen verwenden https://pkg.go.dev/github.com/alexedwards/scs/v2#sessionmanager.loadandsave

Der Beispielcode im Link ist

mux := http.NewServeMux()
    mux.HandleFunc("/put", putHandler)
    mux.HandleFunc("/get", getHandler)

    // Wrap your handlers with the LoadAndSave() middleware.
    http.ListenAndServe(":4000", sessionManager.LoadAndSave(mux))

Der Beispielcode übergibt Mux an Loadandsave und übergibt dann den neuen Handler an http.listenandserve(port, newhandler). In meinem Fall stammte der Handler von der Methode „servehttp“, die ich der Struktur „*httpsserver“ hinzugefügt habe. Der Handler im Beispiel stammt von einem Multiplexer.

Ich bin neu hier. Ist es möglich, meine Methode „servehttp“ an „loadandsave“ zu übergeben und den von „loadandsave“ zurückgegebenen Handler zu verwenden? Wenn nicht, gibt es eine Möglichkeit, die in meinem Beispiel verwendeten http.server-Strukturfelder an http.listenandserve(port, handler) zu übergeben?

Lösung

Genau wie peters func (s *httpserver) run(sessionmanager *scs.sessionmanager) { Adresse := "127.0.0.1:8080" // Wickeln Sie Ihren http-Server mit der Loadandsave-Middleware ein. handlerwithsessions := sessionmanager.loadandsave(s) ... }

Das bedeutet, sessionmanager außerhalb dieser Methode zu erstellen und zu konfigurieren (unter Verwendung von scs. new( )sessionmanager (使用 scs.new()),并在调用 run) und beim Aufruf von run übergeben.
Dort können Sie sessionmanager 设置为 httpserver Felder in der Struktur platzieren.
Dadurch kann Ihr (s *httpserver) servehttp(writer http.responsewriter, r *http.request) es abrufen.

Zum Beispiel:

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)
}

Das obige ist der detaillierte Inhalt vonIst es möglich, http.ServeHttp einzubinden, um eine Sitzung mit alexedwards/scs/v2 hinzuzufügen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:stackoverflow.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen