在写一个 Web 应用的时候,很多人都遇到过这样的需求:如何实现在一个用户登录进来之后,停留时间过久(页面没有操作和活动),我们就自动将用户退出登录?
解决办法其实很简单,我们在 Laravel 中自定义一个 Middleware 就可以实现:
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 分钟内没有操作的话,我们就会跳转到登录页面。