2017-09-28 39 views
19

我做一个Ajax调用,但我不断收到此错误:Laravel 5.5 AJAX调用419(未知状态)

419 (unknown status)

不知道是什么原因造成这个我在其他帖子看到它做CSRF令牌的东西但我没有表格,所以我不知道如何解决这个问题。

我的电话:

$('.company-selector li > a').click(function(e) { 
    e.preventDefault(); 

    var companyId = $(this).data("company-id"); 


     $.ajax({ 
      headers: { 
      'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content') 
      }, 
      url: '/fetch-company/' + companyId, 
      dataType : 'json', 
      type: 'POST', 
      data: {}, 
      contentType: false, 
      processData: false, 
      success:function(response) { 
       console.log(response); 
      } 
    }); 
    }); 

我的路线:

Route::post('fetch-company/{companyId}', '[email protected]'); 

我控制器的方法

/** 
* Fetches a company 
* 
* @param $companyId 
* 
* @return array 
*/ 
public function fetchCompany($companyId) 
{ 
    $company = Company::where('id', $companyId)->first(); 

    return response()->json($company); 
} 

的最终目标是从显示在HTML元素的响应东西。

+2

你有这个吗?' ' –

+0

@HanlinWang不,我没有表格,只是一个下拉菜单。 – Chris

+0

您是否在窗体中添加了{{csrf_field()}}? –

回答

37

使用这头部分:

<meta name="csrf-token" content="{{ csrf_token() }}"> 

,并获得在阿贾克斯CSRF令牌:

$.ajaxSetup({ 
    headers: { 
    'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content') 
    } 
}); 
+0

谢谢,它对我很有帮助。我正在尝试使用'DELETE'方法进行ajax调用,并且这种方式就像一种魅力。 – Salvo

+1

我有这个确切的代码设置,但在以下情况下我仍然遇到OP的问题:用户已登录,但网站长时间保持空闲状态(例如,计算机在打开浏览器时进入睡眠状态)。在这种情况下,当用户回到电脑并尝试AJAX调用时,会发生此错误。重新加载后,一切都恢复正常。任何人都可以解决这个问题? – jovan

2

这类似于卡纳安的答案。但是,这解决了令牌不应发送到跨域网站的问题。如果它是本地请求,这将只设置标题。

HTML:

<meta name="csrf-token" content="{{ csrf_token() }}"> 

JS:

$.ajaxSetup({ 
    beforeSend: function(xhr, type) { 
     if (!type.crossDomain) { 
      xhr.setRequestHeader('X-CSRF-Token', $('meta[name="csrf-token"]').attr('content')); 
     } 
    }, 
}); 
-1
在我来说,我忘了csrf_token输入添加到提交的表单

。 所以我这样做 HTML:

<form class="form-material" id="myform"> 
... 
<input type="file" name="l_img" id="l_img"> 
<input type="hidden" id="_token" value="{{ csrf_token() }}"> 
.. 
</form> 

JS:

//setting containers 
     var _token = $('input#_token').val(); 
     var l_img = $('input#l_img').val(); 
     var formData = new FormData(); 
     formData.append("_token", _token); 
     formData.append("l_img", $('#l_img')[0].files[0]); 

     if(!l_img) { 
      //do error if no image uploaded 
      return false; 
     } 
     else 
     { 
      $.ajax({ 
       type: "POST", 
       url: "/my_url", 
       contentType: false, 
       processData: false, 
       dataType: "json", 
       data : formData, 
       beforeSend: function() 
       { 
        //do before send 
       }, 
       success: function(data) 
       { 
        //do success 
       }, 
       error: function(jqXhr, textStatus, errorThrown) //jqXHR, textStatus, errorThrown 
       { 
        if(jqXhr.status === "422") { 
         //do error 
        } else { 
         //do error 
        } 
       } 
      }); 
     } 
     return false; //not to post the form physically 
0

即使你有一个csrf_token,如果你是使用Laravel Policies验证您的控制器动作,你可以有419的反应也是如此。在这种情况下,您应该在您的Policy课程中添加必要的政策功能。

5

解决此问题的另一种方法是在ajax数据中使用_token字段并在刀片中设置{{csrf_token()}}的值。这是我刚刚尝试的一个工作代码。

$.ajax({ 
    type: "POST", 
    url: '/your_url', 
    data: { somefield: "Some field value", _token: '{{csrf_token()}}' }, 
    success: function (data) { 
     console.log(data); 
    }, 
    error: function (data, textStatus, errorThrown) { 
     console.log(data); 

    }, 
}); 
0

如果您已经完成了上述建议并仍然存在问题。

确保环境变量:

SESSION_SECURE_COOKIE 

设置为false如果你没有SSL证书,像本地的。