2014-09-29 14 views
7

Vor der Verwendung von Sitzungen in golang Start ich Antworten müssen auf einige FragenBest Practice mit Sitzungen (Gorilla/Sitzungen)

Sitzung 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 Sitzungen hinzufügen auf der gleichen Domain mit verschiedenen Namen?

Wann benötigen Sie mehrere Sitzungen auf derselben Domäne?

Q2:

Was ist die beste Praxis die Variablen aus der Sitzung zu bekommen? my_session_var = session.Values ​​[ "foo"]

Q3:

Wie kann man überprüfen, ob die Sitzung korrekt gespeichert wird? Wenn Sie auf map zugreifen, um Variablen zu setzen und abzurufen?

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 

Antwort

5

Der Artikel "BASIC EXTENSION OF GO’S HTTP HANDLERS" (Simon Whitehead) zeigt ein Beispiel, wo und wann Sitzung zu definieren.
Anstatt es in der Handler selbst zu tun, und eine Menge Code zu duplizieren, wenn Sie andere Handler definieren.

Mit einem named type können Sie definieren die Handler Sie brauchen:

type handler func(w http.ResponseWriter, r *http.Request, db *mgo.Database) 

(in Ihrem Fall wäre es ein Gorilla-Sitzungen statt einer mgo Sitzung oder eine Datenbank sein)

Die init() function nehmen Pflege der Session-Erstellung (hier Mago-Session, aber die Idee ist die gleiche für andere Framework-Sitzungen)

Und Sie können diese Funktion Typ stellen Sie sicher, (‚handler‘) nicht respektiert die ServeHTTP() Funktion, Pflege nehmen:

  • der Session-Management (Klon/Schließen)
  • Ihre tatsächlichen Handler aufrufen (die haben mehr Parameter als nur w und r)

    func (h handler) ServeHTTP(w http.ResponseWriter, r *http.Request) { 
        s := session.Clone() 
        defer s.Close() 
    
        h(w, r, s.DB("example")) 
    } 
    

Dann können Sie Ihre tatsächlichen Handler (wieder mit m definieren ehr als w und r):

func myHandler(w http.ResponseWriter, r *http.Request, db *mgo.Database) { 
    var users []user 

    db.C("users").Find(nil).All(&users) 

    for _, user := range users { 
     fmt.Fprintf(w, "%s is %d years old", user.Name, user.Age) 
    } 
} 

Und Sie können diesen Handler in Ihrem Server verwenden:

func main() { 
    mux := http.NewServeMux() 
    mux.Handle("/", handler(myHandler)) 
    http.ListenAndServe(":8080", mux) 
} 

Die Idee ist es, die "Sanitär" in main() auf ein Minimum zu begrenzen, während ein Handler mit mit mehr Parametern (einschließlich Ihrer Sitzung).
, dass Sie verschiedene Handlers mit sehr wenig Sanitär verwenden kann, halten main() nur für die Erklärung des anderen Weges (und nicht für die Initialisierung der Sitzung und Handler)

+0

Mehr auf Sitzung speziell auf http: // Stackoverflow. com/a/21866122/6309 – VonC

+0

habe meine Frage aktualisiert .. erhalten einen Fehler beim Übersetzen – clarkk

+0

@clarkk das wäre am besten als separate Frage. – VonC