Best-practice-Sitzungen mit (gorilla/Sitzungen)
Bevor Sie beginnen Nutzung von sessions in golang ich brauche die Antworten auf einige Fragen, die
session-Beispiel
import "github.com/gorilla/sessions"
var store = sessions.NewCookieStore([]byte("33446a9dcf9ea060a0a6532b166da32f304af0de"))
func Handler(w http.ResponseWriter, r *http.Request){
session, _ := store.Get(r, "session-name")
session.Values["foo"] = "bar"
session.Values[42] = 43
session.Save(r, w)
fmt.Fprint(w, "Hello world :)")
}
func main(){
store.Options = &sessions.Options{
Domain: "localhost",
Path: "/",
MaxAge: 60 * 15,
Secure: false,
HttpOnly: true,
}
}
Q1:
Ist es möglich, mehrere sessions auf die gleiche domain mit unterschiedlichen Namen?
session1, _ := store.Get(r, "session-name-1")
session2, _ := store.Get(r, "session-name-2")
Wann benötigen Sie mehrere Sitzungen auf derselben domain?
Q2:
Was ist die beste übung, um die Variablen aus der session?
my_session_var = Sitzung.Werte["foo"]
Q3:
Wie um zu überprüfen, ob die Sitzung gespeichert wird, richtig? Wenn Sie Zugriff auf die gleichen map
zu beiden set-und get-Variablen?
update
package main
import (
"github.com/gorilla/sessions"
)
var (
store = sessions.NewCookieStore([]byte("33446a9dcf9ea060a0a6532b166da32f304af0de"))
)
type handler func(w http.ResponseWriter, r *http.Request, s *sessions.Session)
func (h handler) ServeHTTP(w http.ResponseWriter, r *http.Request){
session, _ := store.Get(r, "session-name")
h(w, r, session)
}
func Handler_404(w http.ResponseWriter, r *http.Request, s *sessions.Session){
fmt.Fprint(w, "Oops, something went wrong!")
}
Fehler
# command-line-arguments
.\mux.go:101: cannot convert Handler_404 (type func(http.ResponseWriter, *http.Request, *sessions.Session)) to type http.HandlerFunc
Du musst angemeldet sein, um einen Kommentar abzugeben.
Den Artikel "BASIC-ERWEITERUNG GEHEN DIE HTTP-HANDLER" (Simon Whitehead) zeigt ein Beispiel, wo und Wann die Sitzung definieren.
Anstatt das zu tun, es in der
Handler
selbst, und duplizieren Sie eine Menge code, wenn Sie andere Handler definieren.Mit einem mit Typ, können Sie definieren die
Handler
Sie brauchen:(in Ihrem Fall, es wäre ein gorilla-Sitzungen statt eines mgo-session oder Datenbank)
Den
init()
- Funktion kümmern uns um die session-Erzeugung (hier mgo-Sitzung, aber die Idee ist die gleiche für andere Rahmen-Sitzungen)Und können Sie sicherstellen, dass diese Funktion type ('
handler
') ist hinsichtlich derServeHTTP()
Funktion, aufpassen:ruft Ihren tatsächlichen handler (die haben mehr Parameter als nur
w
undr
)Dann definieren Sie Ihre tatsächliche
Handler
(wieder mit mehr alsw
undr
):Und die Sie verwenden können, handler in deiner server:
Die Idee ist die Begrenzung des "Sanitär" in
main()
auf ein minimum, während einHandler
mit mehr Parametern (einschließlich Ihrer session).Das erlaubt die Verwendung verschiedener
Handlers
mit sehr wenig Sanitär -, haltenmain()
nur für die Erklärung von den anderen Weg (und nicht für die Initialisierung des Sitzungs-und Handler)Update 2019: in einem anderen Zusammenhang, siehe auch "Umgang mit sessions".