suchen

Heim  >  Fragen und Antworten  >  Hauptteil

Ist es in Laravel möglich, die Sitzungszeit basierend auf der aufgerufenen Route dynamisch zu verlängern?

<p>Der Titel fasst mein Problem ziemlich gut zusammen. </p> <p>Das Unternehmen, für das ich arbeite, verfügt über eine Laravel-Anwendung, bei der die Sitzungszeit auf <code>config/session.php</code> nach <strong>120 Minuten</strong> abläuft Wir möchten diesen Wert nicht ändern. </p> <p>Aber das System verfügt über eine spezielle Funktion, bei der der Benutzer eine große Anzahl von Formularen/Fragebögen beantworten muss.<strong>wenn der Benutzer langsam tippt, kann das Ausfüllen mehr als 3 oder 4 Stunden dauern.</ strong>Zurück vor dem Absenden. Überdenken Sie einige Antworten. </p> <p>Das Problem besteht darin, dass einige Benutzer immer noch nicht alle Fragen beantwortet haben und durch den Sitzungsablauf den Fortschritt verlieren. Manchmal stellen sie erst nach ein paar Minuten fest, dass die Sitzung abgelaufen ist, wenn sie zur „nächsten Seite“ wechseln " von Fragen. Wir haben darüber nachgedacht, die bereits ausgefüllten Daten zu speichern, aber selbst wenn wir AJAX-Aufrufe verwenden, um den Inhalt beizubehalten und die bereits ausgefüllten Abschnitte in der Datenbank zu speichern, ist es immer noch eine schlechte Benutzererfahrung, sich bei der Beantwortung des Formulars erneut anmelden zu müssen, da sie benötigt werden Um es trotzdem zu verfolgen, verlinken Sie erneut auf die Formularseite. Wir erhalten viele Beschwerden von Kunden wegen abgelaufener Sitzungen. </p> <p>Die beste Lösung besteht darin, eine Art Funktion in <code>FormController.php</code> zu erstellen und wenn der Benutzer die Formularseite oder eine andere spezifische Route betritt, führen wir so etwas wie <code>session aus () Operation ->extendSessionInMinutes(360)</code>. Ich habe etwas recherchiert, konnte aber weder in der Laravel-Dokumentation (bitte beachten Sie, dass wir <code>Laravel 8.1</code> verwenden) noch in Stackoverflow etwas Ähnliches finden. Diese Woche habe ich viel über dieses Thema gelesen, etwa eine Lösung zum Erstellen einer neuen Middleware, die basierend auf der Benutzerrolle unterschiedliche Sitzungslebenszyklen bereitstellt, oder so etwas in der Art, aber diese Option hat bei uns nicht funktioniert. </p> <p>Ich arbeite an einer Lösung, die eine ähnliche Lösung verwendet, um eine <strong>neue Variable</strong> hinzuzufügen; >addHours( 2))</code> um genau zu wissen, wann die Sitzung 2 Stunden erreicht, damit ich <strong>die Standardeinstellung von <code>SESSION_LIFETIME</code> festlegen kann Setzen Sie den Wert auf 5 Stunden und fügen Sie eine JS-Funktion hinzu, um alle 30 Minuten zu prüfen, ob eine Abmeldung erforderlich ist, und leiten Sie den Benutzer zur Abmeldeseite weiter. Wenn er sich auf der Formularseite befindet, stoppen wir die Prüfung. </p> <p>Aber ich glaube nicht, dass das wirklich eine gute Lösung ist, aber mir fällt anscheinend auch keine andere Lösung ein.Gibt es eine Möglichkeit, das zu erreichen, was ich möchte, indem ich die Sitzungszeit auf irgendeine Weise verlängere? Oder erstellen Sie die Sitzung neu, ohne dass sich dies auf den Benutzer auswirkt (<em>ich wette, das wird das CSRF-Token auf dem Formular durcheinander bringen</em>) und geben Sie ihm 2 Stunden Zeit, während er das obige Formular weiter ausfüllt, um die Sitzung nahtlos neu zu erstellen ohne irgendwelche Veränderungen zu bemerken? </p> <p>Kann ich die Ablaufzeit einer Sitzung nicht ändern, nachdem ich sie erstellt habe? Gibt es eine Art PHP-Bibliothek, die mir helfen kann, ohne die standardmäßige sitzungsbezogene Funktionalität von Laravel zu sehr zu ändern? </p> <p><em>Vielen Dank im Voraus für alle Kommentare. </em></p>
P粉019353247P粉019353247455 Tage vor636

Antworte allen(1)Ich werde antworten

  • P粉978551081

    P粉9785510812023-09-02 00:13:22

    是的,可以。并且您需要执行以下操作-

    1. 只有通过中间件才能动态更改会话生命周期。因为通过任何控制器(没有中间件)更改它都不会更改会话值,因为会话已经启动。所以你需要一个中间件。就像下面这样-
    namespace App\Http\Middleware;
    
    class ChangeSessionValueDynamically
    {
        /**
         * Handle an incoming request.
         *
         * @param  \Illuminate\Http\Request  $request
         * @param  \Closure  $next
         * @return mixed
         */
        public function handle($request, $next)
        {
            $lifetime = 1440; /* Minutes*/
            config(['session.lifetime' => $lifetime]); /* Helper function */
            return $next($request);
        }
    }
    1. 之后,您需要将该中间件添加到 app/Http/Kernel.php 文件中的 $middlewarePriority 数组中,该文件必须在 Laravel 运行自己的“StartSession”中间件之前执行。就像下面这样-

    \Illuminate\Session\Middleware\StartSession::class, 之前添加 \App\Http\Middleware\ChangeSessionValueDynamically::class,

    /**
         * The priority-sorted list of middleware.
         *
         * This forces non-global middleware to always be in the given order.
         *
         * @var array
         */
        protected $middlewarePriority = [
         ....
         ....
            \App\Http\Middleware\ChangeSessionValueDynamically::class
            \Illuminate\Session\Middleware\StartSession::class,
         ....
         ....   
        ];
    1. 提供 \App\Http\Middleware\ChangeSessionValueDynamically::class 的别名,如下所示 -
    /**
        * The application's route middleware.
        *
        * These middleware may be assigned to groups or used individually.
        *
        * @var array
        */
       protected $routeMiddleware = [
        ....
        ....
           'dynamic_session' => \App\Http\Middleware\ChangeSessionValueDynamically::class,
        ....   
        ....
       ];
    1. 将该中间件包含在路由中,如下所示 -
    A) For Group Routes- 
    Route::group([.., 'middleware' => ['dynamic_session', ..]], function () {
        ..
        Route::get('route_1', ['uses' => 'AbcController@index', 'as' => 'abc.index']);
        ..
    }
    
    B) OR For single Route-
    Route::get('route_1', ['uses' => 'AbcController@index', 'as' => 'abc.index'])->middleware('dynamic_session');

    Antwort
    0
  • StornierenAntwort