Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/467.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 会话过期时如何处理laravel令牌不匹配异常_Javascript_Php_Ajax_Laravel_Session - Fatal编程技术网

Javascript 会话过期时如何处理laravel令牌不匹配异常

Javascript 会话过期时如何处理laravel令牌不匹配异常,javascript,php,ajax,laravel,session,Javascript,Php,Ajax,Laravel,Session,当会话过期时,用户无法在不刷新页面的情况下重新登录,因为ajax头中的\u令牌已过期(也称为令牌不匹配异常)。我无法通过将用户重定向到登录页面来处理异常,因为登录是一种覆盖模式,请求是通过ajax处理的 我想我可以在Handler.php中捕获不匹配异常,并返回带有会话令牌的json响应。在客户端,使用新令牌继续预期的过程。但是,当我使用从服务器传递的新令牌时,会话令牌将在服务器端再次更改,这将导致另一个令牌不匹配异常 那么,在不刷新页面的情况下,如何以安全的方式处理异常呢 以下是我现在拥有的:

当会话过期时,用户无法在不刷新页面的情况下重新登录,因为ajax头中的
\u令牌已过期(也称为
令牌不匹配异常
)。我无法通过将用户重定向到登录页面来处理异常,因为登录是一种覆盖模式,请求是通过ajax处理的

我想我可以在
Handler.php
中捕获不匹配异常,并返回带有会话令牌的json响应。在客户端,使用新令牌继续预期的过程。但是,当我使用从服务器传递的新令牌时,会话令牌将在服务器端再次更改,这将导致另一个
令牌不匹配异常

那么,在不刷新页面的情况下,如何以安全的方式处理异常呢

以下是我现在拥有的:

在全局js文件中设置csrf_令牌

   $(function () {
       $.ajaxSetup({
         headers: { 'X-CSRF-TOKEN': $('meta[name="csrf_token"]').attr('content') }
       });
     });
app/exceptions/handler.php中的render方法:

  public function render($request, Exception $e)
    {
        if ($this->isHttpException($e))
        {
            return $this->renderHttpException($e);
        }
        else if ($e instanceof TokenMismatchException)
        {
            if ($request->ajax()) {
                return response()->json([
                    'message' => 'TokenMismatchException',
                    'token' => csrf_token()
                ]);
            }
        }
        else
        {
            return parent::render($request, $e);
        }
    }
在authentication.js中:

  $.ajax({
    type: "POST",
    url: "/auth/login",
    data: {
      "email" : $('#login_email').val(),
      "password" : $('#login_password').val(),
      'remember': $('#login_remember').is(':checked')
    },
    success: function(response) {
      if (response.message === 'TokenMismatchException') {
        console.log(response);  //message and token exist
        //if catch the exception, use the new token to set up the ajax headers and login again

           $.ajaxSettings.headers["X-CSRF-TOKEN"] = response.token;
           console.log($.ajaxSettings.headers["X-CSRF-TOKEN"]);
           $.ajax({
             type: "POST",
             url: "/auth/login",
             data: {
               "email" : $('#login_email').val(),
               "password" : $('#login_password').val(),
              'remember': $('#login_remember').is(':checked'),
             },
             success: function(res) {
               console.log(res);

             },
             error: function(err) {
               console.log(err);
             }
         });

      }
      console.log('logged in');  
    },
    error: function(xhr, status, err) {
    }
  });

提前感谢。

在渲染函数中,您必须检查特定的令牌不匹配异常。因此,您可以尝试以下方式:

   if ($exception instanceof \Illuminate\Session\TokenMismatchException) {
        return response()->json('msg', 'Your session has expired. Please try again.');
    }
您还可以将一个新的csrf_令牌与json一起传递,以便可以用新令牌替换旧令牌并再次发送表单请求

if ($exception instanceof \Illuminate\Session\TokenMismatchException) {
            return response()->json(['msg'=> 'Your session has expired. Please try again.', 'token'=> csrf_token()]);
        }
我还没有测试过这段代码。但这应该让你开始


另外,如果您愿意,您可以使用一个软件包:

嘿,我已经按照您的建议做了。请检查我的密码。另外,我相信laravel咖啡因目前只适用于php页面上的表单,而不是ajax表单。对我来说似乎没问题。你试过这个代码吗?令牌不匹配是一种安全功能,因此这种方法也会为任何试图使用无效令牌向服务器发送请求的人打开大门。无效。尝试中的第二次登录也会产生相同的异常。这是因为后端上的会话令牌再次刷新。你有更好的解决方案吗?