Javascript Larvel:在ajax请求会话过期后重定向到登录
如果我登录到我的web应用程序,等待会话过期,然后在我的web应用程序中使用表单发出ajax请求,我会在控制台中看到以下错误:Javascript Larvel:在ajax请求会话过期后重定向到登录,javascript,php,jquery,ajax,laravel,Javascript,Php,Jquery,Ajax,Laravel,如果我登录到我的web应用程序,等待会话过期,然后在我的web应用程序中使用表单发出ajax请求,我会在控制台中看到以下错误: 加载资源失败:服务器响应状态为500(内部服务器错误) 理想的情况是重定向到登录页面,或者在触发ajax请求的表单下显示一条错误消息(即对用户有意义的消息)。可能值得注意的是,如果用户在表单上出现验证错误,我已经有了抛出错误的客户端代码来向用户显示错误消息 我相信我知道如何检查会话是否过期,并向用户返回有用的信息,告诉他们登录,但我不确定如何在全球范围内实现这一点。所以
加载资源失败:服务器响应状态为500(内部服务器错误)
理想的情况是重定向到登录页面,或者在触发ajax请求的表单下显示一条错误消息(即对用户有意义的消息)。可能值得注意的是,如果用户在表单上出现验证错误,我已经有了抛出错误的客户端代码来向用户显示错误消息
我相信我知道如何检查会话是否过期,并向用户返回有用的信息,告诉他们登录,但我不确定如何在全球范围内实现这一点。所以我想知道是否有可能在Laravel中从后端全局处理这个问题,并且(或者)我是否需要为每个ajax请求编写一些逻辑来捕获问题,从而在客户端显示错误消息
我正在使用Laravel和Javascript/JQuery。谢谢你的帮助 以下是针对您的案例的快速解决方案: 控制器(例如AuthController.php): 此外,可能还需要添加此方法名称,以便
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
@if(Auth::user())
$(函数(){
setInterval(函数checkSession(){
$.get('/check session',函数(数据){
//如果会话已过期
if(data.guest){
//重定向到登录页面
//location.assign('/auth/login');
//或者,也许更好,只是重新加载页面
location.reload();
}
});
},60000);//每分钟
});
@恩迪夫
使用中间件
中间件:
<?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.
});
查看:
<?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.
});
您是否有一个特定的问题?如上所述,后面是一个问号:“我想知道是否有可能在Laravel中从后端全局处理这个问题,并且(或者)我是否需要为每个ajax请求编写一些逻辑来捕获问题,以显示客户端的错误消息?”-这不是讽刺性的-谢谢。也许还不够具体-抱歉。@haakym如果你对我下面的回答满意,请接受:)我还没有机会尝试,我会尽快反馈。非常感谢你的回答。