Maison > développement back-end > Golang > le corps du texte

Est-il possible d'envelopper http.ServeHttp dans Go pour ajouter une session en utilisant alexedwards/scs/v2

PHPz
Libérer: 2024-02-09 09:30:19
avant
564 Les gens l'ont consulté

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

Bonjour, éditeur php Zimo ! Concernant votre question sur l'encapsulation de http.ServeHTTP dans Go pour ajouter des sessions à l'aide d'alexedwards/scs/v2, la réponse est oui. Vous pouvez utiliser la bibliothèque alexedwards/scs/v2 pour gérer les sessions et envelopper http.ServeHTTP dans votre code Go. De cette façon, vous pouvez ajouter des fonctionnalités de gestion de sessions pour utiliser des sessions dans votre application lors du traitement des requêtes HTTP. De cette façon, vous pouvez facilement ajouter une authentification, une autorisation et d'autres fonctionnalités liées à la session à votre application. J'espère que cette réponse vous sera utile !

Contenu de la question

J'essaie d'ajouter des sessions à un serveur http existant écrit en go. J'ai le code suivant

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) {
     ...
}
Copier après la connexion

Je souhaite utiliser l'ajout de session https://pkg.go.dev/github.com/alexedwards/scs/v2#sessionmanager.loadandsave

L'exemple de code dans le lien est

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

    // Wrap your handlers with the LoadAndSave() middleware.
    http.ListenAndServe(":4000", sessionManager.LoadAndSave(mux))
Copier après la connexion

L'exemple de code transmet mux à loadandsave, puis transmet le nouveau gestionnaire à http.listenandserve (port, newhandler). Dans mon cas, le gestionnaire provenait de la méthode servehttp que j'ai ajoutée à la structure *httpserver. Le gestionnaire dans l'exemple provient d'un multiplexeur.

Je suis nouveau ici. Est-il possible de transmettre ma méthode servehttp à Loadandsave et d'utiliser le gestionnaire renvoyé par Loadandsave ? Sinon, existe-t-il un moyen de transmettre les champs de structure http.server utilisés dans mon exemple dans http.listenandserve(port, handler) ?

Solution

Tout comme le func (s *httpserver) run(sessionmanager *scs.sessionmanager) { de peter adresse := "127.0.0.1:8080" // enveloppez votre serveur http avec le middleware loadandsave. handlerwithsessions := sessionmanager.loadandsave(s) ... }

Cela signifie créer et configurer sessionmanager en dehors de cette méthode (en utilisant scs. new( )sessionmanager (使用 scs.new()),并在调用 run), et transmis lors de l'appel de run.
Là, vous pouvez placer sessionmanager 设置为 httpserver champs dans la structure.
Cela permettra à votre (s *httpserver) servehttp(writer http.responsewriter, r *http.request) de le récupérer.

Par exemple :

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)
}
Copier après la connexion

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Étiquettes associées:
source:stackoverflow.com
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!