2017-07-19 2 views
2

Ich habe eine allgemeine Frage zu Sitzungen. Ich bin nicht sehr gewürzt, wenn es um dieses Thema geht. Ich habe versucht, mit:Gorilla/Sitzungen persistent zwischen Serverneustarts?

NewRediStore (gopkg.in/boj/redistore.v1) 
NewCookieStore 
NewFileSystemStore 

Ich hatte den Eindruck, dass Sitzungen zwischen Server neu gestartet wird, daher die Notwendigkeit für eine ‚Store‘ dauern könnte. Während mein Golfang-Backend läuft, kann ich neue Sitzungen einrichten und für mehrere Benutzer/Browser abrufen. Keine Probleme dort.

Wenn ich meinen Server neu starte, merke ich, dass alle Sitzung Zugriff in session.IsNew == true. In Redis kann ich alle Sitzungsschlüssel nach dem Neustart sehen, und verifiziert sogar, dass .Get Sitzung die richtige ID abgerufen, aber IsNew ist immer noch festgelegt.

ich intuitiv erraten, ist dies sinnvoll, da es muss eine Karte im Speicher sein, der auf die Einstellung von IsNew führt aber ich würde denken, dass, wenn es ein Treffer für den Cookie erzeugten Schlüssel im Laden ist, IsNew nicht eingestellt werden soll. Werde ich verrückt? Gibt es etwas Leichtes, dass ich falsch mache? Ist das ein grundlegendes Missverständnis, wie man Sitzungen benutzt? Bitte lassen Sie mich wissen, wenn ich Code oder zusätzliche Details hinzufügen muss.

Antwort

1

Ich hätte die gleichen Annahmen, die Sie gemacht haben, und durchsuchen die Quelle, es sieht aus wie es sollte funktionieren, wie Sie beschrieben. Sie könnten versuchen, es zu debuggen und durchlaufen, insbesondere die Methode New für den Speicher, den Sie verwenden (z. B. FilesystemStore.New oder RediStore.New). Wenn diese Methode den Cookie erfolgreich liest und die Sitzung im Speicher findet, sollte er entsprechend der Quelle IsNew = false festlegen.

Beachten Sie auch, dass das Überprüfen der Sitzungs-ID nicht eine gute Möglichkeit ist, dieses Verhalten zu überprüfen. Wenn Sie sich die Quelle ansehen, dekodiert sie die Sitzungs-ID aus dem Cookie, , dann versucht, das im Backing Store nachzuschlagen. Wenn die Suche fehlschlägt, stimmt die Sitzungs-ID überein, aber IsNew ist true und in der Sitzung werden keine Werte angezeigt. Stellen Sie sicher, dass Sie in der Sitzung einen Wert festlegen und überprüfen Sie diesen Wert anstelle der Sitzungs-ID. Das Verhalten unterscheidet sich für die CookieStore, da es die Sitzungsdaten im Cookie selbst speichert.

+1

Interessant. Ich habe in Redistore hineingeschaut und dabei [https://github.com/boj/redistore/blob/v1.2/redistore.go#L242] im Code gesehen und beschlossen, dort ein paar Sachen zu drucken. 'ok == true' ** und **' err == "gob: Name nicht für die Schnittstelle registriert:" gitlab.com/droneprime/spectre.host/server/internal/handlers.User "" 'Das scheint seltsam zu sein Fehler an dieser Stelle im Code zu bekommen? Es scheint, dass das in meinem Code sein sollte? – droneprime

+1

Ich habe mein Problem gelöst. Sie müssen sich nicht nur mit "encoding/gob" registrieren, wenn Sie Daten eingeben, sondern auch, wenn Sie versuchen, auf Daten zuzugreifen. Danke, dass Sie mich ermutigt haben, den Code der Bibliothek zu lesen. Das werde ich in Zukunft zuerst machen :) – droneprime