如果我登录到我的网络应用程序,等待会话过期,然后在我的网络应用程序中使用表单发出ajax请求,我会在控制台中显示以下错误:
Failed to load resource: the server responded with a status of 500 (Internal Server Error)
理想情况下,会发生重定向到登录页面,或者在触发ajax请求的表单下显示错误消息(即对用户有意义的事情)。值得注意的是,我已经有客户端代码抛出错误,如果他们在表单上发出验证错误,则向用户显示错误消息。
我相信我知道如何检查会话是否过期并向用户返回一些有用的信息,告诉他们登录,但我不确定我是如何全局实现的。所以我想知道是否有可能从Laravel的后端全局处理这个问题,并且(或)我是否需要为每个ajax请求编写一些逻辑以捕获问题以显示客户端的错误消息?
我正在使用Laravel和Javascript / JQuery。谢谢你的帮助!
答案 0 :(得分:5)
以下是您案例的快速解决方案:
控制器(例如AuthController.php):
/**
* Check user session.
*
* @return Response
*/
public function checkSession()
{
return Response::json(['guest' => Auth::guest()]);
}
此外,可能需要将此方法名称添加到guest
中间件忽略:
$this->middleware('guest', ['except' => ['logout', 'checkSession']]);
<强>路线强>:
Route::get('check-session', 'Auth\AuthController@checkSession');
布局(JS部分),仅适用于已登录的用户:
@if (Auth::user())
<script>
$(function() {
setInterval(function checkSession() {
$.get('/check-session', function(data) {
// if session was expired
if (data.guest) {
// redirect to login page
// location.assign('/auth/login');
// or, may be better, just reload page
location.reload();
}
});
}, 60000); // every minute
});
</script>
@endif
答案 1 :(得分:1)
使用中间件
<强>中间件:强>
<?php namespace App\Http\Middleware;
class OldMiddleware {
/**
* Run the request filter.
*
* @param \Illuminate\Http\Request $request
* @param \Closure $next
* @return mixed
*/
public function handle($request, Closure $next)
{
if(!**condition to check login**)
{
// if session is expired
return response()->json(['message' => 'Forbidden!'],403);
}
return $next($request);
}
}
<强>路线:强>
Route::group(['middleware' => '\App\Http\Middleware\OldMiddleware'], function(){
//put the routes which needs authentication to complete
});
查看:强>
$.ajax({
type: 'post',
url: {{route('someroute')}}
//etc etc
}).done(function(data){
//do if request succeeds
}).fail(function(x,y,z){
//show error message or redirect since it is failed.
});