Be part of JetBrains PHPverse 2026 on June 9 – a free online event bringing PHP devs worldwide together.

DoubleUp's avatar

How to set or edit session in Laravel

Hello guys. As the title says, how do I set a session time out to redirect back to a login page? I'm using Laravel 9 and using Laravel Jestsream for my middleware. If I leave the page too long, there is no notification nor it will automatically refresh to login page as session ended, instead it will stay as it is until the user click a button and there will be an error

Attempt to read property "name" on null

The error line would be because of the

<?php echo e(Auth::user()->name); ?>

How do I create a session ended page or just directly refresh to direct user to the front page/main page isntead of showing the Auth name error?

Here is my web.php codes:

<?php

use Illuminate\Support\Facades\Route;

use App\Http\Controllers\HomeController;

use App\Http\Controllers\AdminController;

use App\Models\Penyedia;

use App\Models\Pekerjaan;

use App\Models\Jeniskerja;

use App\Models\Personil;
/*
|--------------------------------------------------------------------------
| Web Routes
|--------------------------------------------------------------------------
|
| Here is where you can register web routes for your application. These
| routes are loaded by the RouteServiceProvider within a group which
| contains the "web" middleware group. Now create something great!
|
*/


Route::get('/',[HomeController::class,'index']);

Route::get('/beranda',[HomeController::class,'redirect']);

Route::get('/admindashboard',[AdminController::class,'admindashboard']);

Route::get('/datapenyedia',[AdminController::class,'tabelpenyedia'])->name('datapenyedia');

Route::get('/tambahpenyedia',[AdminController::class,'tambahpenyedia']);

Route::post('/penyediabaru/penyediabarucheck',[AdminController::class,'penyediabarucheck'])->name('penyediabarucheck');

Route::post('/insertpenyedia',[AdminController::class,'insertpenyedia']);

Route::get('/editpenyedia/{id}',[AdminController::class,'editpenyedia']);

Route::post('/updatepenyedia/{id}',[AdminController::class,'updatepenyedia']);

Route::get('/deletepenyedia/{id}',[AdminController::class,'deletepenyedia']);

Route::get('/datapekerjaan',[AdminController::class,'tabelpekerjaan'])->name('datapekerjaan');

Route::get('/tambahpekerjaan',[AdminController::class,'tambahpekerjaan']);

Route::post('/pekerjaanbaru/pekerjaanbarucheck',[AdminController::class,'pekerjaanbarucheck'])->name('pekerjaanbarucheck');

Route::post('/insertpekerjaan',[AdminController::class,'insertpekerjaan']);

Route::get('/editpekerjaan/{id}',[AdminController::class,'editpekerjaan']);

Route::post('/updatepekerjaan/{id}',[AdminController::class,'updatepekerjaan']);

Route::get('/deletepekerjaan/{id}',[AdminController::class,'deletepekerjaan']);

Route::get('/datauser',[AdminController::class,'tabeluser'])->name('datauser');

Route::get('/tambahuser',[AdminController::class,'tambahuser']);

Route::post('/insertuser',[AdminController::class,'insertuser']);

Route::get('/edituser/{id}',[AdminController::class,'edituser']);

Route::post('/updateuser/{id}',[AdminController::class,'updateuser']);

Route::get('/deleteuser/{id}',[AdminController::class,'deleteuser']);

Route::get('/datanilai_penyedia',[AdminController::class,'tabelnilai_penyedia'])->name('datanilai_penyedia');

Route::get('/datanilai_jeniskerja/{penyedia}',[AdminController::class,'tabelnilai_jeniskerja'])->name('datanilai_jeniskerja');

Route::get('/nilaipekerjaan/{penyedia}',[AdminController::class,'showpekerjaan'])->name('showpekerjaan');

Route::get('/nilaipekerjaan',[AdminController::class,'showpekerjaanppk'])->name('showpekerjaanppk');

Route::get('/nilai/{id}',[AdminController::class,'nilaipekerjaan']);

Route::post('/updatenilaipekerjaan/{id}',[AdminController::class,'update_nilaipekerjaan']);

Route::get('/bahp/{id}',[AdminController::class,'bahppekerjaan']);

Route::post('/updatebahppekerjaan/{id}',[AdminController::class,'update_bahppekerjaan']);

Route::get('pekerjaans/{id}/download',[AdminController::class,'download'])->name('pekerjaans.download');

Route::get('/profilpenyedia/{penyedia}',[AdminController::class,'showpenyedia'])->name('showpenyedia');

Route::get('/datapersonil',[AdminController::class,'tabelpersonil'])->name('datapersonil');

Route::get('/personilbaru',[AdminController::class,'personilbaru']);

Route::post('/personilbaru/personilbarucheck',[AdminController::class,'personilbarucheck'])->name('personilbarucheck');

Route::post('/insertpersonil',[AdminController::class,'insertpersonil']);

Route::get('/editpersonil/{id}',[AdminController::class,'editpersonil']);

Route::post('/updatepersonil/{id}',[AdminController::class,'updatepersonil']);

Route::get('/deletepersonil/{id}',[AdminController::class,'deletepersonil']);

Route::get('/tambahpersonil/{id}',[AdminController::class,'tambahpersonil']);

Route::post('/updatepersonilpekerjaan/{id}',[AdminController::class,'update_personilpekerjaan']);

Route::get('/rekappekerjaan',[AdminController::class,'rekappekerjaan']);

Route::middleware([
    'auth:sanctum',
    config('jetstream.auth_session'),
    'verified'
])->group(function () {
    Route::get('/dashboard', function () {
        return view('dashboard');
    })->name('dashboard');
});
0 likes
2 replies
LaryAI's avatar
Level 58

To set a session timeout in Laravel, you can modify the lifetime value in the config/session.php file. By default, the lifetime value is set to 120 minutes (2 hours). You can change this value to the number of minutes you want the session to last before it times out. For example, if you want the session to time out after 30 minutes, you can set the lifetime value to 30:

'lifetime' => 30,

To redirect the user to the login page when the session times out, you can modify the App\Http\Middleware\Authenticate middleware. In the handle method, you can check if the user is authenticated and if the session has expired. If the session has expired, you can redirect the user to the login page. Here's an example:

public function handle(Request $request, Closure $next, ...$guards)
{
    if (Auth::guard($guard)->check()) {
        if ($request->session()->has('last_activity')) {
            $last_activity = $request->session()->get('last_activity');
            $timeout = config('session.lifetime') * 60;
            if (time() - $last_activity > $timeout) {
                Auth::guard($guard)->logout();
                $request->session()->invalidate();
                $request->session()->regenerateToken();
                return redirect('/login')->with('message', 'Your session has expired. Please log in again.');
            }
        }
        $request->session()->put('last_activity', time());
    }
    return $next($request);
}

This code checks if the user is authenticated and if the session has expired. If the session has expired, it logs the user out, invalidates the session, regenerates the CSRF token, and redirects the user to the login page with a message. If the session has not expired, it updates the last_activity value in the session.

Snapey's avatar

The browser wont know that the server session has expired in order to refresh, however you can assume it has if the same page has been displayed longer than the session lifetime

with a simple addition to the of the main layout template:

<meta http-equiv="refresh" content="{{ config('session.lifetime') * 60 }}">

This simple line will refresh the page when it gets to the end of the session. If the page is protected by auth middleware then it will be redirected to login

Please or to participate in this conversation.