Verwalten der Serverbenutzersitzung in der clientseitigen Einzelseiten-App

9

Ich habe mit verschiedenen clientseitigen Technologien herumgefummelt, wie AngularJS, EmberJS, sogar versucht, gerade JQuery zu verwenden und herauszufinden, wie man ReactJS damit verwenden kann. Abgesehen davon ist mein Ziel, eine einzelne Seite App mit json zwischen dem Client und einem Java-Jersey 2 jax-rs Back-End-API zu bauen.

Ich habe gerade zwei Stolpersteine. Einige Informationen aber..Ich stelle meine App als WAR-Datei in Jetty bereit. Mein Backend basiert auf Java. Ich verwende ab sofort nur jquery auf der Clientseite.

Mein Haupthindernis ist, wie man mit dem Login, Logout und Session Management umgeht. Mit einer Rest-API und der Verwendung von Ajax, habe ich Login-Funktion, einschließlich der Einrichtung eines Cookies. Meine Sorge ist jedoch mit einer einzelnen Seite App, gibt es nur die eine Indexseite, und wenn der Benutzer den Browser schließt, dann öffnet es wieder auf der Indexseite, während der Cookie / Sitzung noch gut ist, sollte der Benutzer angemeldet sein, nicht sehen Sie die Außenseite (nicht angemeldet) -Seite. Ich bin mir nicht sicher, wie ich damit umgehen soll, sei es eine jsp-Seite, index.html mit einer Templat-Bibliothek usw. Mit JSP kann ich etwas Scriplet-Code einfügen (entgegen meiner besseren Beurteilung). In den alten Tagen würde ich eine Überschrift einschließen, die nach request.getSession (). GetAttribute ("Benutzer") überprüfen würde und wenn es dort war. Der Benutzer war eingeloggt und using scriplet if () Code, den ich a. Anzeigen würde eingeloggte Kopfzeile anstelle der nicht eingeloggten Kopfzeile. Aber ich bin der Überzeugung, dass es einen besseren Weg geben muss, dies mit den heutigen JS-Frameworks auf Kundenseite zu tun.

Der andere Stolperstein ist die Navigation und die dynamischen Aspekte. Zum Beispiel, wenn ich mit eckigen js herumalberte, war es einfach genug, Willkommen {{name}} zu verwenden und innerhalb des Bereichs den Namen durch einen json-Antwortwert für den angemeldeten Benutzer zu ersetzen. In meiner derzeitigen Situation bin ich nicht genau sicher, wie man am besten dynamische Bits wie diese mit reinem jquery anzeigen kann, außer einer Art $ ("# elem-id"). InnerHtml="..." Code innerhalb der Antwort zu verwenden Erfolgsmethode eines Ajax-Aufrufs. Ich bin mir nicht ganz sicher, wie ich mit der Navigation zu verschiedenen Seiten umgehen soll. Meine geloggte Seite wird einige Dropdown-Menüs oder Links enthalten, die den Inhaltsbereich durch unterschiedlich viele Inhalte ersetzen.

Also, was sind einige Möglichkeiten in einem SPA um Benutzersitzungen zu behandeln, im Falle eines Seiten-Reloads oder um den Browser-Neustart zu beenden oder zu beenden .. um sicherzustellen, dass der Benutzer immer noch angemeldet ist und sie auf die richtige Seite leitet? Zweitens, welche Art von Templating- und Routing- / Navigationsoptionen gibt es, die nicht verlangen, dass ich eine riesige Menge Code in meine einzige index.jsp-Seite lege?

Danke.

    
user3317868 17.02.2014, 06:08
quelle

2 Antworten

19

Wenn Sie eine REST-API als Back-End verwenden, müssen Sie oAuth als Authentifizierungsmechanismus implementiert haben. Das heißt, wenn sich Ihr Benutzer mit einem Benutzernamen und einem Kennwort anmeldet, tauschen Sie diese Daten mit einem Authentifizierungstoken aus. Dieses Authentifizierungstoken wird Ihrem Server mit jedem API-Aufruf gesendet und Ihr Back-End validiert dieses Token, bevor es die Anfrage bearbeitet. Bis jetzt klar?

Wenn Sie das Zugriffstoken erhalten, können Sie auch die Ablaufzeit des Zugriffstokens vom Server abrufen und diese Daten in Ihrer clientseitigen App speichern. In localStorage vielleicht? Und wenn Ihr Benutzer den Browser schließt und erneut öffnet, können Sie zuerst prüfen, ob ein solches Zugriffstoken verfügbar ist (und nicht abgelaufen ist), bevor Sie den Benutzer zur Anmeldung auffordern. Dies sollte Ihr erstes Problem lösen.

Zweitens, wenn Sie nach einer leichten Routing-Option suchen, empfehle ich Regisseur .

    
ncabral 17.02.2014, 06:17
quelle
1

Ich baue eine ähnliche Anwendung. OAuth ist nicht obligatorisch. Sie können normale Sitzungen usw. durchführen, indem Sie den Jersey-Anmeldeendpunkt treffen und eine Sitzung und einen Cookie "keepme" mit der Sitzung festlegen, wenn der Benutzer dauerhaft angemeldet sein möchte. Sie können dann beispielsweise einen Trikot-AuthFilter verwenden, um zu prüfen, ob ein Cookie vorhanden ist mit einer gültigen Sitzung oder einer aktiven Sitzung und halten Sie den Benutzer angemeldet.

Ihre Frontend-Anwendung sollte kein Mitspracherecht haben, nur mit dem Server kommunizieren und wenn sie keinen unbefugten Zugriff erhält (vom AuthFilter), wird sie fortgesetzt, ansonsten zeigt sie die Login-Seite an.

    
arisalexis 06.06.2014 12:59
quelle