[RUBY] Ich habe versucht, die Sitzung in Rails zu organisieren

Wir machen viele Rails-Tutorials. In Bezug auf die in Kapitel 8 behandelte "Sitzung" habe ich diesmal einen Artikel geschrieben, den ich nach meinem eigenen Verständnis organisieren möchte. Da ich ein Anfänger bin, wäre ich Ihnen dankbar, wenn Sie in den Kommentaren auf Fehler hinweisen könnten.

Was ist überhaupt eine Sitzung? (Antworten) Ein "Mechanismus", der "zustandsbehaftete Kommunikation" realisiert.

Was ist zustandsbehaftet? Der HTML-Code, den wir normalerweise verwenden, kommuniziert zustandslos. * Zustand weniger = 1 Mal 1 Mal unabhängiger Austausch

Bei dieser Kommunikation ist die Kommunikation zwischen dem Browser und dem Server für jede Hin- und Rückfahrt unabhängig. Vorherige Informationen können nicht vererbt werden.

Möglicherweise fragen Sie sich jedoch, wann Sie diese Geschichte hören. Wenn die gesamte HTML-Kommunikation unabhängig ist, z. B. auf einer Einkaufsseite, Wenn Sie den Artikel, den Sie kaufen möchten, in den Warenkorb legen, werden die Informationen nicht übertragen Der Warenkorb sollte leer sein, wenn Sie Seiten wechseln.

Also, ** Der Mechanismus der Sitzung besteht darin, die zustandslose HTML-Kommunikation "statusbehaftet" zu machen. ** ** **

  • Status (Status) voll (Halten) = Austausch, während der Status "gehalten" wird, z. B. Benutzerinformationen

Bei dieser Kommunikation tauscht der Browser-Server Informationen aus, indem er der Kommunikation Informationen hinzufügt. Es ist möglich, diesen gesamten Austausch in eine Reihe von Aktionen umzuwandeln.

Im obigen Beispiel können Sie auf der Site, auf der Sie sich als Mitglied angemeldet haben, zu verschiedenen Seiten springen, während Sie die Mitgliedsinformationen beibehalten. Dies ist praktisch, da Sie auf der Einkaufsseite immer mehr Dinge in den Warenkorb legen können.

"Stateful Communication" in HTML besteht aus einem Mechanismus, der als Sitzung bezeichnet wird.

Referenz: Sitzungskommunikation

Wie werden

-Sitzungen ausgetauscht? </ h2> (Antworten) Im Allgemeinen wird die Sitzungs-ID in dem von der Browserseite gesendeten "Cookie" enthalten Es wird auf der Serverseite erfasst und sortiert, und der Sitzungsinhalt wird herausgenommen und ausgetauscht. Durch Schließen des Browsers wird die Sitzung gelöscht.

Was ist ein Cookie? Kurz gesagt, Cookies sind Informationen, die vom Webbrowser gespeichert werden.

Sitzungen behandeln nicht immer Cookies, aber sie werden sicherlich häufig verwendet. Rails verwendet standardmäßig auch Cookies, daher gehen wir hier von Cookies aus.

~ Rauer Fluss von Keksen ~

** ① Erster Zugriff ** Die Browserseite greift auf die Serverseite zu. Die Serverseite sendet die Identifikationsinformationen des Browsers (z. B. Anmeldeinformationen), die im HTTP-Header enthalten sind. Der Browser speichert diese Informationen (dies sind die Cookie-Informationen).

** ② Zugriff danach ** Die Browserseite nimmt die gespeicherten Cookie-Informationen in den HTTP-Header auf und sendet sie an die Serverseite. Basierend auf diesen Informationen bestimmt die Serverseite, wer darauf zugegriffen hat.

Auf diese Weise ist das Cookie die Information, die auf der Browserseite gespeichert ist, und durch das Senden einschließlich der Sitzungs-ID kann die Serverseite verstehen, "welche Art von Inhalt haben Sie ausgetauscht?" Ich werde. Übrigens wird der Inhalt der Sitzung selbst von der Webserverseite gehalten, und die Sitzungs-ID im Cookie ist die ID für den Aufruf.

Die Sitzung ist nur vorübergehend und wird grundsätzlich gelöscht, wenn der Browser geschlossen wird.

Was ist eine Sitzung in Rails? Nachdem wir über Konzepte gesprochen haben, sortieren wir den Inhalt von Sitzungen in Rails. Mit Rails können Sie für jeden Benutzer eine Sitzung einrichten. Sitzungen sind nur für Controller und Ansichten verfügbar. Sie können auch die folgenden Speicher auswählen.
Lager Erläuterung
ActionDispatch::Session::CookieStore: Speichern Sie alle Sitzungen in einem Cookie im clientseitigen Browser
ActionDispatch::Session::CacheStore: Speichern Sie Daten im Rails-Cache
ActionDispatch::Session::ActiveRecordStore: Mit Active Record in der Datenbank speichern(activerecord-session_brauche Laden Juwel)
ActionDispatch::Session::MemCacheStore: Speichern Sie Daten in einem zwischengespeicherten Cluster(Diese Implementierung ist alt, daher sollten Sie CacheStore in Betracht ziehen)

Wie bereits erläutert, wird die Sitzungs-ID im Wesentlichen in einem Cookie gespeichert und an den Server übergeben. Für den standardmäßig verwendeten CookieStore werden die ** Sitzungsinformationen selbst auf der Cookie-Seite gespeichert. ** ** **

Der CookieStore bietet die folgenden ** Vorteile **. ・ Sehr leicht ・ Für die Verwendung der Sitzung mit der Webanwendung wurde ein Satz vorbereitet. -Die Cookie-Daten erhalten eine verschlüsselte Signatur, um Manipulationen zu verhindern, und das Cookie selbst wird ebenfalls verschlüsselt, sodass der Inhalt nicht von anderen gelesen werden kann (das manipulierte Cookie wird von Rails abgelehnt).

Es gibt jedoch auch die folgenden ** Nachteile **. ・ Die Obergrenze für Cookies liegt bei 4 KB

  • Da das Cookie auf der Clientseite (Browser) gespeichert wird, bleibt der Inhalt des abgelaufenen Cookies möglicherweise erhalten. ・ Client-Cookies können auf andere Computer kopiert werden ・ Sitzungscookies verfallen nicht von selbst, sodass sie möglicherweise für Missbrauchszwecke wiederverwendet werden.

Grundsätzlich denke ich, dass es besser ist, den von Rails empfohlenen Cookie Store zu verwenden. Ich dachte, dass es notwendig ist, es entsprechend der Situation richtig zu verwenden.

Referenz: Rails-Guide-Sitzung

Sitzungsoperation

Im Folgenden sind alle Vorgänge im Cookie Store aufgeführt, die standardmäßig verwendet werden.

** ・ Eine Sitzung erstellen **

session[:user_id] = @user.id

Die Sitzungsmethode kann mit einem Hashwert festgelegt werden. Durch Festlegen wird ein verschlüsseltes Cookie generiert, das die Informationen dieser Sitzung enthält.

** ・ Siehe Sitzung **

user = User.find(id: session[:user_id])

Informationen zur Sitzung können leicht referenziert werden. Wenn die Sitzungsmethode aufgerufen wird, werden die Cookie-Informationen intern entschlüsselt, und der Wert kann mit session [: symbol] abgerufen werden.

** - Sitzung löschen **

#Alles was du tust ist das gleiche
session[:user_id] = nil
session[:user_id].clear
session.delete(:user_id)

Es ist möglich, mit Null umzuschreiben oder Informationen mit Löschen oder Löschen zu löschen.

Am Ende Die größte Frage, die ich beim Lernen hatte, war die Beziehung zwischen Sitzung und Cookie. Das Verhalten der Sitzungsmethode von Rails (CookieStore) unterscheidet sich von dem, was im Konzept gesagt wird. Ich verstehe nicht gut? Ist voll ... lol

Als ich es erneut organisierte, konnte ich die Punkte identifizieren, die ich nicht verstand, und es war erfrischend. Ich möchte weiter am Rails-Tutorial arbeiten.

Referenzseite Vielen Dank! https://ja.wikipedia.org/wiki/HTTP_cookie https://qiita.com/hththt/items/07136ad74127999df271 https://qiita.com/hot_study_man/items/147f8b767b4135fe6fe4 https://www.justinweiss.com/articles/how-rails-sessions-work/ https://railsguides.jp/security.html

Recommended Posts

Ich habe versucht, die Sitzung in Rails zu organisieren
Daten sortieren Absteigend, aufsteigend / Schienen
[Rails] Ich habe versucht, die Version von Rails von 5.0 auf 5.2 zu erhöhen
Ich habe versucht, die Methode der gegenseitigen Teilung von Eugrid in Java zu implementieren
Ich habe versucht, die Methode zu erklären
[Rails] Ich habe versucht, die Anwendung zu löschen
Ich habe versucht, die verwendeten Methoden zusammenzufassen
Ich habe das neue Yuan-Problem in Java ausprobiert
Ich habe versucht, das Iterator-Muster zu implementieren
Ich habe versucht, die Stream-API zusammenzufassen
Ich habe die AutoValue-Bibliothek mit Intellij ausprobiert
Ich habe versucht, die Ajax-Verarbeitung der ähnlichen Funktion in Rails zu implementieren
Ich habe versucht, den Weihnachtsbaum in einem Lebensspiel zu beleuchten
Ich habe versucht, die Bildvorschau mit Rails / jQuery zu implementieren
Ich habe versucht zu verstehen, wie die Rails-Methode "redirect_to" definiert ist
Ich habe versucht zu verstehen, wie die Rails-Methode "link_to" definiert ist
Ich habe versucht, polymorph in Nogizaka zu implementieren.
Code zum Verbinden von Rails 3 mit PostgreSQL 10
Ich habe versucht, das Problem der Tribonacci-Sequenz in Ruby mit Wiederholung zu lösen.
Ich habe versucht, neunundneunzig in Java auszugeben
Nachdem ich Progate gelernt hatte, versuchte ich, eine SNS-Anwendung mit Rails in der lokalen Umgebung zu erstellen
Ich habe versucht, Tomcat so einzustellen, dass das Servlet ausgeführt wird.
Ich habe versucht, den CPU-Kern mit Ruby voll auszunutzen
Ich habe versucht, eine Anwendung in 2 Sprachen zu entwickeln
Ich habe versucht, Alexa-Fähigkeiten mit Java zu erstellen
[Ruby] Ich habe versucht, die häufigen Methoden in Paiza zusammenzufassen
[Ruby] Ich habe versucht, die häufigen Methoden mit paiza ② zusammenzufassen
So überprüfen Sie Rails-Befehle im Terminal
Ich möchte den Wert in Ruby erhalten
Ich habe versucht, das Problem der Tribonacci-Sequenz in Ruby zu lösen (Zeitlimit 10 Minuten).
Über den Fall, in dem der Freeter "Docker" versucht hat, Docker in die vorhandene Rails-Anwendung einzufügen
Ich war süchtig nach NoSuchMethodError in Cloud-Endpunkten
So stellen Sie die Anzeigezeit in Rails auf japanische Zeit ein
Ich möchte eine TraceId in das Protokoll einbetten
Ich habe versucht, die Firebase-Push-Benachrichtigung in Java zu implementieren
05. Ich habe versucht, die Quelle von Spring Boot zu löschen
# 2 [Anmerkung] Ich habe versucht, neunundneunzig mit Java zu berechnen.
Ich möchte ein kleines Symbol in Rails verwenden
Ich habe versucht, die Kapazität von Spring Boot zu reduzieren
[Rails] Ich weiß nicht, wie ich das Modell verwenden soll ...
Ich habe versucht, eine Clova-Fähigkeit in Java zu erstellen
Ich habe versucht, eine Anmeldefunktion mit Java zu erstellen
Ich habe versucht, das Docker Integration-Plug-In in IntelliJ zu installieren
Ich möchte eine Funktion in der Rails Console definieren
Rails6 Ich habe versucht, Docker in eine vorhandene Anwendung einzuführen
~ Ich habe jetzt versucht, funktionale Programmierung mit Java zu lernen ~
[Schienen] So zeigen Sie Bilder in der Ansicht an
Ich habe versucht herauszufinden, was sich in Java 9 geändert hat
Ich habe Rails Anfänger ausprobiert [Kapitel 1]