Was ist die beste Aktion Persistenz-Technik für eine Catalyst-Anwendung?

8

Ich schreibe eine Catalyst-Anwendung, die einen relativ kurzen Ablauf der Sitzung benötigt (15 Minuten). Ich verwende die standardmäßigen Catalyst-Framework-Authentifizierungsmodule, sodass die Benutzerdaten in der Sitzung gespeichert werden - d. H. Wenn Ihre Sitzung abläuft, werden Sie abgemeldet.

Für viele Anwendungen dieser Anwendung sind 15 Minuten erforderlich. Daher senden Benutzer häufig nur ein Formular, um festzustellen, dass der Sitzungsstatus verloren gegangen ist und sie sich erneut anmelden müssen.

Wenn dies geschieht, möchte ich die ursprüngliche Formularübermittlung beibehalten und wenn sie sich erfolgreich anmelden, weitermachen und die Formularübermittlung ausführen, als ob die Sitzung nicht abgelaufen wäre.

Ich habe die Authentifizierungs-Daten von einer auto () -Methode im Controller verarbeitet - Wenn Sie eine Aktion anfordern, die Authentifizierung erfordert und Sie gerade nicht angemeldet sind, werden Sie zur login () -Methode weitergeleitet, Das zeigt das Anmeldeformular an und verarbeitet es nach der Übermittlung. Es scheint, als ob es möglich sein sollte, die Anfrage und alle Formularparameter zu speichern, wenn die automatische Methode zum login () umleitet und sie dann wieder herauszieht, wenn das login () erfolgreich ist - aber ich bin mir nicht ganz sicher Möglichkeit, diese Informationen generisch / standard / wiederverwendbar zu erfassen oder zu speichern. (Ich versuche, es in der Sitzung zu speichern und es dann zu löschen, sobald es wieder herausgezogen ist; wenn das eine schlechte Idee zu sein scheint, ist das etwas anderes.)

Gibt es einen Standard "Best Practices" oder Kochbuch Weg, dies zu tun?

(Eine Falte: Diese Formulare werden per POST übermittelt.)

    
genehack 06.01.2009, 22:12
quelle

5 Antworten

1

Am Ende haben wir die ausstehende Anfrage (URL + Parameter) in auto () gepackt, serialisiert und verschlüsselt und über ein verstecktes Formularelement auf der Anmeldeseite übergeben. Wenn wir eine Anmeldeanforderung mit dem ausgeblendeten Element erhielten, entschlüsselten und deserialisierten wir es und leiten es dann entsprechend um (indem wir sicherstellen, dass wir den Standard-Codepfad "Kann dieser Benutzer diese Sache machen" passieren).

    
genehack 21.02.2009, 03:35
quelle
4

Ich kann nicht umhin zu denken, dass es einen fundamentalen Makel gibt, wenn man eine 15-minütige Auszeit in einer App verlangt, die routinemäßig & gt; 15 Minuten zwischen Aktionen erfordert.

Wie dem auch sei, ich würde versuchen, die Catalyst::Plugin::Session->delete_session -Methode zu überschreiben, damit alle Inhalte von $c->request->body_parameters serialisiert und gespeichert werden (vermutlich in der Datenbank), um sie später wiederherzustellen. Sie möchten wahrscheinlich eine rudimentäre Überprüfung der POST-Argumente, um sicherzustellen, dass sie das sind, was Sie erwarten.

Ebenso muss create_session die Verantwortung dafür übernehmen, diese Daten aus der Datenbank zu entfernen und für die ursprüngliche Formularaktion verfügbar zu machen.

Es scheint wie eine unordentliche Situation, und ich bin geneigt, meinen ersten Satz zu wiederholen ...

UPDATE:

Unabhängig davon, ob Sie delete_session oder auto verwenden, bleibt das paradoxe Problem bestehen: Sie können diese Informationen nicht in der Sitzung speichern, da das Zeitüberschreitungs-Ereignis die Sitzung zerstört. Sie müssen es irgendwo dauerhafter speichern, damit es die Neuinitialisierung der Sitzung überlebt. Catalyst::Plugin::Session verwendet selbst Storable , und Sie sollten in der Lage sein, etwas mitzubekommen diese Zeilen:

%Vor%

Die zugrunde liegende Tabelle hat wahrscheinlich (user CHAR (x), formitems TEXT) oder ähnliches. Vielleicht ein Zeitstempel, damit nichts zu alt wird. Möglicherweise möchten Sie auch die Aktion speichern, die Sie verarbeitet haben, um sicherzustellen, dass die abgerufenen Formularelemente zum richtigen Formular gehören. Sie kennen die Probleme Ihrer App besser als ich.

    
RET 07.01.2009 01:18
quelle
2

Ich würde die Formulardaten als eine Art von Benutzerdaten im Modell speichern.

Catalyst :: Plugin :: Session :: PerUser ist eine Möglichkeit das tun (wenn auch etwas hackisch). Ich würde empfehlen, das Session-Plugin nur zur Authentifizierung zu verwenden und stattdessen alle Statusinformationen in dem Modell zu speichern, in dem Ihre Benutzerdaten gespeichert sind.

Und ich stimme der Meinung von RET voll und ganz zu, dass die 15-Minuten-Grenze in diesem Zusammenhang wirklich kontraproduktiv erscheint.

    
nothingmuch 07.01.2009 04:07
quelle
1
___ qstnhdr ___ Was ist die beste Aktion Persistenz-Technik für eine Catalyst-Anwendung? ___ answer419156 ___

Ich würde die Formulardaten als eine Art von Benutzerdaten im Modell speichern.

Catalyst :: Plugin :: Session :: PerUser ist eine Möglichkeit das tun (wenn auch etwas hackisch). Ich würde empfehlen, das Session-Plugin nur zur Authentifizierung zu verwenden und stattdessen alle Statusinformationen in dem Modell zu speichern, in dem Ihre Benutzerdaten gespeichert sind.

Und ich stimme der Meinung von RET voll und ganz zu, dass die 15-Minuten-Grenze in diesem Zusammenhang wirklich kontraproduktiv erscheint.

    
___ qstntxt ___

Ich schreibe eine Catalyst-Anwendung, die einen relativ kurzen Ablauf der Sitzung benötigt (15 Minuten). Ich verwende die standardmäßigen Catalyst-Framework-Authentifizierungsmodule, sodass die Benutzerdaten in der Sitzung gespeichert werden - d. H. Wenn Ihre Sitzung abläuft, werden Sie abgemeldet.

Für viele Anwendungen dieser Anwendung sind 15 Minuten erforderlich. Daher senden Benutzer häufig nur ein Formular, um festzustellen, dass der Sitzungsstatus verloren gegangen ist und sie sich erneut anmelden müssen.

Wenn dies geschieht, möchte ich die ursprüngliche Formularübermittlung beibehalten und wenn sie sich erfolgreich anmelden, weitermachen und die Formularübermittlung ausführen, als ob die Sitzung nicht abgelaufen wäre.

Ich habe die Authentifizierungs-Daten von einer auto () -Methode im Controller verarbeitet - Wenn Sie eine Aktion anfordern, die Authentifizierung erfordert und Sie gerade nicht angemeldet sind, werden Sie zur login () -Methode weitergeleitet, Das zeigt das Anmeldeformular an und verarbeitet es nach der Übermittlung. Es scheint, als ob es möglich sein sollte, die Anfrage und alle Formularparameter zu speichern, wenn die automatische Methode zum login () umleitet und sie dann wieder herauszieht, wenn das login () erfolgreich ist - aber ich bin mir nicht ganz sicher Möglichkeit, diese Informationen generisch / standard / wiederverwendbar zu erfassen oder zu speichern. (Ich versuche, es in der Sitzung zu speichern und es dann zu löschen, sobald es wieder herausgezogen ist; wenn das eine schlechte Idee zu sein scheint, ist das etwas anderes.)

Gibt es einen Standard "Best Practices" oder Kochbuch Weg, dies zu tun?

(Eine Falte: Diese Formulare werden per POST übermittelt.)

    
___ tag123perl ___ Perl ist eine prozedurale, allgemeine Programmiersprache für allgemeine Zwecke, die für ihre native Unterstützung von regulären Ausdrücken und String-Parsing-Funktionen bekannt ist. Bitte verwenden Sie diesen Tag für Fragen zu Perl im Allgemeinen. Für Dinge, die mit der neuen (aber verwandten) Sprache "Perl 6" zu tun haben, verwenden Sie bitte das perl6-Tag. Verwenden Sie für reguläre Ausdrücke nach Perl-Art in anderen Sprachen das Regex-Tag oder, falls sie auf der PCRE-Bibliothek basieren, das PCRE-Tag. ___ answer418848 ___

Ich kann nicht umhin zu denken, dass es einen fundamentalen Makel gibt, wenn man eine 15-minütige Auszeit in einer App verlangt, die routinemäßig & gt; 15 Minuten zwischen Aktionen erfordert.

Wie dem auch sei, ich würde versuchen, die %code% -Methode zu überschreiben, damit alle Inhalte von %code% serialisiert und gespeichert werden (vermutlich in der Datenbank), um sie später wiederherzustellen. Sie möchten wahrscheinlich eine rudimentäre Überprüfung der POST-Argumente, um sicherzustellen, dass sie das sind, was Sie erwarten.

Ebenso muss %code% die Verantwortung dafür übernehmen, diese Daten aus der Datenbank zu entfernen und für die ursprüngliche Formularaktion verfügbar zu machen.

Es scheint wie eine unordentliche Situation, und ich bin geneigt, meinen ersten Satz zu wiederholen ...

UPDATE:

Unabhängig davon, ob Sie %code% oder %code% verwenden, bleibt das paradoxe Problem bestehen: Sie können diese Informationen nicht in der Sitzung speichern, da das Zeitüberschreitungs-Ereignis die Sitzung zerstört. Sie müssen es irgendwo dauerhafter speichern, damit es die Neuinitialisierung der Sitzung überlebt. %code% verwendet selbst Storable , und Sie sollten in der Lage sein, etwas mitzubekommen diese Zeilen:

%Vor%

Die zugrunde liegende Tabelle hat wahrscheinlich (user CHAR (x), formitems TEXT) oder ähnliches. Vielleicht ein Zeitstempel, damit nichts zu alt wird. Möglicherweise möchten Sie auch die Aktion speichern, die Sie verarbeitet haben, um sicherzustellen, dass die abgerufenen Formularelemente zum richtigen Formular gehören. Sie kennen die Probleme Ihrer App besser als ich.

    
___ answer572100 ___

Am Ende haben wir die ausstehende Anfrage (URL + Parameter) in auto () gepackt, serialisiert und verschlüsselt und über ein verstecktes Formularelement auf der Anmeldeseite übergeben. Wenn wir eine Anmeldeanforderung mit dem ausgeblendeten Element erhielten, entschlüsselten und deserialisierten wir es und leiten es dann entsprechend um (indem wir sicherstellen, dass wir den Standard-Codepfad "Kann dieser Benutzer diese Sache machen" passieren).

    
___ tag123catalyst ___ Catalyst ist ein Perl-Webanwendungsframework, ähnlich wie Ruby on Rails, Spring (Java) und Maypole. ___ answer421121 ___

Sie könnten immer etwas Javascript auf dem Client haben, das die Sitzung am Ablauf hindert, indem Sie alle paar Minuten eine kleine Anfrage machen.

Oder Sie könnten AJAX nach einer aktiven Sitzung suchen lassen, bevor Sie das Formular posten und dem Benutzer zu diesem Zeitpunkt bei Bedarf eine neue Anmeldebox präsentieren.

    
___ antwort437489 ___

Ich bin darauf gestoßen, als ich CPAN nach etwas ganz anderem befragt habe.

Catalyst :: Plugin :: Wizard gibt vor, genau das zu tun, was Sie brauchen. Die Dokumentation schlägt vor, dass es auf eine Anmeldeseite umleiten kann, während der Status der vorherigen Aktion beibehalten wird.

NB: Ich habe es nicht benutzt, kann also nicht für seine Wirksamkeit bürgen.

    
___
RET 12.01.2009 23:38
quelle
0

Sie könnten immer etwas Javascript auf dem Client haben, das die Sitzung am Ablauf hindert, indem Sie alle paar Minuten eine kleine Anfrage machen.

Oder Sie könnten AJAX nach einer aktiven Sitzung suchen lassen, bevor Sie das Formular posten und dem Benutzer zu diesem Zeitpunkt bei Bedarf eine neue Anmeldebox präsentieren.

    
Chuck Phillips 07.01.2009 17:01
quelle

Tags und Links