Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Adakah mungkin untuk membungkus http.ServeHttp dalam go untuk menambah sesi menggunakan alexedwards/scs/v2

Adakah mungkin untuk membungkus http.ServeHttp dalam go untuk menambah sesi menggunakan alexedwards/scs/v2

PHPz
PHPzke hadapan
2024-02-09 09:30:19564semak imbas

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

Helo, editor php Zimo! Mengenai soalan anda tentang membungkus http.ServeHTTP dalam Pergi untuk menambah sesi menggunakan alexedwards/scs/v2, jawapannya adalah ya. Anda boleh menggunakan perpustakaan alexedwards/scs/v2 untuk mengurus sesi dan membungkus http.ServeHTTP dalam kod Go anda. Dengan cara ini anda boleh menambah keupayaan pengurusan sesi untuk menggunakan sesi dalam aplikasi anda apabila mengendalikan permintaan HTTP. Dengan cara ini anda boleh menambahkan pengesahan, kebenaran dan fungsi berkaitan sesi lain dengan mudah pada aplikasi anda. Harap jawapan ini membantu anda!

Kandungan soalan

Saya cuba menambah sesi pada pelayan http sedia ada yang ditulis dalam go. Saya mempunyai kod berikut

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

Saya nak guna add session https://pkg.go.dev/github.com/alexedwards/scs/v2#sessionmanager.loadandsave

Kod contoh dalam pautan ialah

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

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

Kod contoh menghantar mux ke loadandsave dan kemudian menyerahkan pengendali baharu ke http.listenandserve(port, newhandler). Dalam kes saya, pengendali datang daripada kaedah servehttp yang saya tambahkan pada struktur *httpserver. Pengendali dalam contoh berasal dari pemultipleks.

Saya baru di sini. Adakah mungkin untuk lulus kaedah servehttp saya untuk memuatkan dan menggunakan pengendali yang dikembalikan daripada loadandsave? Jika tidak, adakah terdapat cara untuk menghantar medan struct http.server yang digunakan dalam contoh saya ke http.listenandserve(port, handler) ?

Penyelesaian

Sama seperti peter's func (s *httpserver) run(sessionmanager *scs.sessionmanager) { alamat := "127.0.0.1:8080" // bungkus httpserver anda dengan loadansave middleware. handlerwithsessions := sessionmanager.loadandsave(s) ... }

Ini bermakna mencipta dan mengkonfigurasi sessionmanager di luar kaedah ini (menggunakan scs. new( )sessionmanager (使用 scs.new()),并在调用 run), dan dihantar masuk apabila memanggil run.
Di sana anda boleh meletakkan sessionmanager 设置为 httpserver medan dalam struktur.
Ini akan membolehkan (s *httpserver) servehttp(writer http.responsewriter, r *http.request) anda mendapatkannya semula.

Contohnya:

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

Atas ialah kandungan terperinci Adakah mungkin untuk membungkus http.ServeHttp dalam go untuk menambah sesi menggunakan alexedwards/scs/v2. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Artikel ini dikembalikan pada:stackoverflow.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam