首页 >后端开发 >Golang >是否可以将 http.ServeHttp 包装在 go 中以使用 alexedwards/scs/v2 添加会话

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

PHPz
PHPz转载
2024-02-09 09:30:19641浏览

是否可以将 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()sessionmanager (使用 scs.new()),并在调用 run),并在调用 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删除