Dalam Laravel, adakah mungkin untuk memanjangkan masa sesi secara dinamik berdasarkan laluan yang diakses?
P粉019353247
P粉019353247 2023-09-01 17:36:54
0
1
621
<p>Tajuk itu merumuskan masalah saya. </p> <p>Syarikat tempat saya bekerja mempunyai aplikasi Laravel di mana masa sesi pada <code>config/session.php</code> ditetapkan untuk tamat tempoh selepas <strong>120 minit</strong> Kami tidak mahu mengubah nilai ini. </p> <p>Tetapi sistem mempunyai ciri khusus di mana pengguna perlu menjawab sejumlah besar borang/soal selidik,<strong>jika pengguna lambat menaip, ia mungkin mengambil masa lebih daripada 3 atau 4 jam untuk menyelesaikan</ strong>Kembali sebelum menyerahkan Pertimbangkan semula beberapa jawapan. </p> <p>Masalahnya ialah sesetengah pengguna masih belum menyelesaikan semua soalan dan tamat tempoh sesi menyebabkan mereka kehilangan kemajuan, dan kadangkala mereka hanya mengetahui selepas beberapa minit bahawa mereka telah beralih ke "halaman seterusnya" soalan. Kami mempertimbangkan untuk menyimpan data yang telah diisi, tetapi walaupun kami meneruskan kandungan dengan panggilan AJAX dan menyimpan bahagian yang sudah diisi ke pangkalan data, perlu log masuk semula apabila menjawab borang masih akan menjadi pengalaman pengguna yang buruk sejak mereka perlu mengikutinya juga, pautan ke halaman borang sekali lagi. Kami menerima banyak aduan daripada pelanggan kerana sesi tamat tempoh. </p> <p>Penyelesaian terbaik ialah mencipta beberapa jenis fungsi pada <code>FormController.php</code> dan apabila pengguna memasuki halaman borang atau beberapa laluan khusus lain, kami akan melaksanakan sesuatu seperti <code>session () Operasi ->extendSessionInMinutes(360)</code>. Saya melakukan beberapa penyelidikan tetapi tidak menemui apa-apa yang serupa pada dokumentasi Laravel (sila ambil perhatian bahawa kami menggunakan <code>Laravel 8.1</code>) atau Stackoverflow. Baca banyak tentang topik ini minggu ini, seperti penyelesaian tentang mencipta perisian tengah baharu yang menyediakan kitaran hayat sesi berbeza berdasarkan peranan pengguna atau sesuatu seperti itu, tetapi pilihan ini tidak berfungsi untuk kami. </p> <p>Saya sedang mengusahakan penyelesaian yang akan menggunakan penyelesaian yang serupa untuk menambah <strong>pembolehubah baharu</strong> <kod>session()->put('time_to_logout' , now()- >addHours( 2))</code> untuk mengetahui dengan tepat bila sesi mencapai 2 jam, jadi saya boleh<strong>menetapkan lalai <code>SESSION_LIFETIME</code></strong> nilai kepada 5 jam dan tambah fungsi JS untuk menyemak setiap 30 minit jika log keluar diperlukan dan halakan pengguna ke halaman log keluar, jika dia berada di halaman borang kami akan menghentikan semakan. </p> <p>Tetapi saya tidak fikir ini sebenarnya penyelesaian yang baik, tetapi saya tidak dapat memikirkan penyelesaian lain.Adakah terdapat cara untuk mencapai apa yang saya mahu dengan memanjangkan masa sesi dalam beberapa cara? Atau buat semula sesi tanpa menjejaskan pengguna (<em>Saya yakin ini akan mengacaukan token CSRF pada borang</em>) dan berikan masa selama 2 jam sementara dia terus mengisi borang di atas masa untuk mencipta semula sesi dengan lancar tanpa perasan sebarang perubahan? </p> <p>Tidak bolehkah saya menukar masa tamat sesi selepas saya menciptanya? Adakah terdapat beberapa jenis perpustakaan PHP yang boleh membantu saya tanpa mengubah terlalu banyak fungsi berkaitan sesi lalai Laravel? </p> <p><em>Terima kasih terlebih dahulu untuk sebarang ulasan. </em></p>
P粉019353247
P粉019353247

membalas semua(1)
P粉978551081

Ya, anda boleh. Dan anda perlu melakukan perkara berikut -

  1. Perubahan dinamik kepada kitaran hayat sesi hanya boleh dilakukan melalui perisian tengah. Kerana menukarnya melalui mana-mana pengawal (tiada middleware) tidak akan mengubah nilai sesi kerana sesi sudah dimulakan. Jadi anda memerlukan perisian tengah. Macam ni-
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. Selepas itu, anda perlu menambah middleware pada tatasusunan $middlewarePriority dalam fail app/Http/Kernel.php, yang mesti dilaksanakan sebelum Laravel menjalankan middleware "StartSession" sendiri. Macam ni-

di 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. Berikan alias untuk AppHttpMiddlewareChangeSessionValueDynamically::class seperti yang ditunjukkan di bawah -
/**
    * 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. Sertakan perisian tengah ini dalam laluan anda seperti yang ditunjukkan di bawah -
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');
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan