在寫一個 Web 應用的時候珊搀,很多人都遇到過這樣的需求:如何實現(xiàn)在一個用戶登錄進來之后北启,停留時間過久(頁面沒有操作和活動)跛蛋,我們就自動將用戶退出登錄糕档?
解決辦法其實很簡單莉恼,我們在 Laravel 中自定義一個 Middleware 就可以實現(xiàn):
namespace App\Http\Middleware;
use Closure;
class SessionTimeout
{
protected $timeout = 1200;
public function handle($request, Closure $next)
{
$isLoggedIn = $request->path() != 'logout';
if ( !session('lastActivityTime')) {
app('session')->put('lastActivityTime', time());
} elseif (time() - app('session')->get('lastActivityTime') > $this->timeout) {
app('session')->forget('lastActivityTime');
$cookie = cookie('intend', $isLoggedIn ? url()->current() : 'home');
$email = $request->user()->email;
auth()->logout();
return route('login')->withInput(['email' => $email])->withCookie($cookie);
}
$isLoggedIn ? app('session')->put('lastActivityTime', time()) : app('session')->forget('lastActivityTime');
return $next($request);
}
我們主要是通過 lastActivityTime 這個記錄來判斷用戶是否有對應的操作(刷新頁面或者是訪問新的頁面等),
如果在 20 分鐘內沒有操作的話,我們就會跳轉到登錄頁面俐银。
不好的一點是:這樣的解決方案其實記錄的 session 值會很多尿背,消耗一定的性能,特別是你的 session 存儲在文件的時候捶惜,更是慢田藐。