Javascript Larvel:在ajax请求会话过期后重定向到登录

Javascript Larvel:在ajax请求会话过期后重定向到登录,javascript,php,jquery,ajax,laravel,Javascript,Php,Jquery,Ajax,Laravel,如果我登录到我的web应用程序,等待会话过期,然后在我的web应用程序中使用表单发出ajax请求,我会在控制台中看到以下错误: 加载资源失败:服务器响应状态为500(内部服务器错误) 理想的情况是重定向到登录页面,或者在触发ajax请求的表单下显示一条错误消息(即对用户有意义的消息)。可能值得注意的是,如果用户在表单上出现验证错误,我已经有了抛出错误的客户端代码来向用户显示错误消息 我相信我知道如何检查会话是否过期,并向用户返回有用的信息,告诉他们登录,但我不确定如何在全球范围内实现这一点。所以

如果我登录到我的web应用程序,等待会话过期,然后在我的web应用程序中使用表单发出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如果你对我下面的回答满意,请接受:)我还没有机会尝试,我会尽快反馈。非常感谢你的回答。