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

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

本文关键字:过期 重定向 登录 会话 ajax 请求 Laravel      更新时间:2023-09-26

如果我登录到我的 Web 应用程序,等待会话过期,然后使用我的 Web 应用程序中的表单发出 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.
});