recherche

Maison  >  Questions et réponses  >  le corps du texte

Dans Laravel, est-il possible de prolonger dynamiquement la durée de la session en fonction de l'itinéraire consulté ?

<p>Le titre résume assez bien mon problème. </p> <p>L'entreprise pour laquelle je travaille dispose d'une application Laravel dans laquelle la durée de la session sur <code>config/session.php</code> doit expirer après <strong>120 minutes</strong> Nous ne voulons pas changer cette valeur. </p> <p>Mais le système a une fonctionnalité spécifique selon laquelle l'utilisateur doit répondre à un grand nombre de formulaires/questionnaires,<strong>si l'utilisateur est lent à taper, cela peut prendre plus de 3 ou 4 heures pour le remplir</ strong>Retournez avant de soumettre Reconsidérez certaines réponses. </p> <p>Le problème est que certains utilisateurs n'ont toujours pas répondu à toutes les questions, et l'expiration de la session leur fait perdre leur progression, et parfois ils ne découvrent qu'après quelques minutes qu'ils sont passés à la "page suivante". de questions. Nous avons envisagé de sauvegarder les données déjà renseignées, mais même si nous conservions le contenu avec un appel AJAX et enregistrions la partie déjà renseignée dans la base de données, devoir se reconnecter en répondant au formulaire serait toujours une mauvaise expérience utilisateur car ils devraient de toute façon le suivre, créer à nouveau un lien vers la page du formulaire. Nous recevons beaucoup de plaintes de clients en raison de l'expiration de sessions. </p> <p>La meilleure solution est de créer une sorte de fonction sur <code>FormController.php</code> et lorsque l'utilisateur entre dans la page de formulaire ou dans un autre itinéraire spécifique, nous exécuterons quelque chose comme <code>session () Opération ->extendSessionInMinutes(360)</code>. J'ai fait quelques recherches mais je n'ai rien trouvé de similaire dans la documentation de Laravel (veuillez noter que nous utilisons <code>Laravel 8.1</code>) ou Stackoverflow. J'ai beaucoup lu sur ce sujet cette semaine, comme une solution concernant la création d'un nouveau middleware qui fournit un cycle de vie de session différent en fonction du rôle de l'utilisateur ou quelque chose comme ça, mais cette option n'a pas fonctionné pour nous. </p> <p>Je travaille sur une solution qui utilisera une solution similaire pour ajouter une <strong>nouvelle variable</strong> <code>session()->put('time_to_logout' , now()- >addHours( 2))</code> pour savoir exactement quand la session atteint 2 heures, afin que je puisse<strong>définir la valeur par défaut de <code>SESSION_LIFETIME</code></strong> la valeur à 5 heures et ajoutez une fonction JS pour vérifier toutes les 30 minutes si la déconnexion est requise et rediriger l'utilisateur vers la page de déconnexion, s'il est sur la page du formulaire nous arrêterons la vérification. </p> <p>Mais je ne pense pas que ce soit réellement une bonne solution, mais je n'arrive pas à penser à une autre solution.Existe-t-il un moyen d'accomplir ce que je veux en prolongeant la durée de la session d'une manière ou d'une autre ? Ou recréez la session sans affecter l'utilisateur (<em> Je parie que cela gâchera le jeton CSRF sur le formulaire </em>) et donnez-lui 2 heures pendant qu'il continue de remplir le formulaire. Les fois ci-dessus, recréez la session de manière transparente sans avez-vous remarqué des changements ? </p> <p>Une fois qu'une session est créée, son délai d'expiration ne peut pas être modifié ? Existe-t-il une sorte de bibliothèque PHP qui peut m'aider sans trop modifier les fonctionnalités liées à la session par défaut de Laravel ? </p> <p><em>Merci d'avance pour vos commentaires. </em></p>
P粉019353247P粉019353247451 Il y a quelques jours622

répondre à tous(1)je répondrai

  • P粉978551081

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

    Oui, vous pouvez. Et vous devez faire ce qui suit -

    1. Les modifications dynamiques du cycle de vie de la session ne sont possibles que via un middleware. Car le changer via n'importe quel contrôleur (pas de middleware) ne changera pas la valeur de la session puisque la session est déjà démarrée. Il vous faut donc un middleware. Juste comme ça-
    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. Ensuite, vous devez ajouter le middleware au tableau $middlewarePriority dans le fichier app/Http/Kernel.php, qui doit être exécuté avant que Laravel n'exécute son propre middleware "StartSession". Juste comme ça-

    à IlluminateSessionMiddlewareStartSession::class, 之前添加 AppHttpMiddlewareChangeSessionValueDynamically::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. Fournissez un alias pour AppHttpMiddlewareChangeSessionValueDynamically::class comme indiqué ci-dessous -
    /**
        * 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. Incluez ce middleware dans votre itinéraire comme indiqué ci-dessous -
    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');

    répondre
    0
  • Annulerrépondre