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

时间:2015-03-16 09:07:47

标签: javascript php jquery ajax laravel

如果我登录到我的网络应用程序,等待会话过期,然后在我的网络应用程序中使用表单发出ajax请求,我会在控制台中显示以下错误:

Failed to load resource: the server responded with a status of 500 (Internal Server Error)

理想情况下,会发生重定向到登录页面,或者在触发ajax请求的表单下显示错误消息(即对用户有意义的事情)。值得注意的是,我已经有客户端代码抛出错误,如果他们在表单上发出验证错误,则向用户显示错误消息。

我相信我知道如何检查会话是否过期并向用户返回一些有用的信息,告诉他们登录,但我不确定我是如何全局实现的。所以我想知道是否有可能从Laravel的后端全局处理这个问题,并且(或)我是否需要为每个ajax请求编写一些逻辑以捕获问题以显示客户端的错误消息?

我正在使用Laravel和Javascript / JQuery。谢谢你的帮助!

2 个答案:

答案 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.
});