繁体   English   中英

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

[英]Laravel: Redirect to login after session has expired on ajax request

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

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

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

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

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

以下是您案例的快速解决方案:

控制器 (例如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

使用中间件

中间件:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM