Laravel 5.5 ajax 呼叫419(状态未知)

我做了一个 ajax 调用,但我不断得到这个错误:

419(状态未知)

不知道是什么原因,我看到这在其他职位它必须做一些与 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}', 'HomeController@fetchCompany');

我的控制器方法

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


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

最终目标是在 html 元素中显示响应中的内容。

292732 次浏览

在标题部分使用:

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

并获取 Ajax 中的 csrf 令牌:

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

请参阅 Laravel 文档 Csrf _ token

这与坎南的回答相似。但是,这修复了令牌不应发送到跨域站点的问题。这只会在头是本地请求时设置它。

HTML:

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

约翰逊:

$.ajaxSetup({
beforeSend: function(xhr, type) {
if (!type.crossDomain) {
xhr.setRequestHeader('X-CSRF-Token', $('meta[name="csrf-token"]').attr('content'));
}
},
});

在我的例子中,我忘记在提交的表单中添加 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>

约翰逊:

//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

即使您有一个 csrf_token,如果您使用 LaravelPolicies验证您的控制器操作,您也可以有419响应。在这种情况下,您应该在 Policy类中添加必要的策略函数。

解决这个问题的另一种方法是在 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);


},
});

如果你已经做了以上的建议,仍然有问题。

确保 env 变量:

SESSION_SECURE_COOKIE

设置为 false 如果时,您没有 SSL 证书,就像在本地上一样。

在你的页面中使用这个

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

并且在你的 ajax 中使用它在数据中:

_token: '{!! csrf_token() !!}',

即:

$.ajax({
url: '/fetch-company/' + companyId,
dataType : 'json',
type: 'POST',
data: {
_token: '{!! csrf_token() !!}',
},
contentType: false,
processData: false,
success:function(response) {
console.log(response);
}
});

谢谢。

您的会话域可能与您的应用程序 URL 和/或用于访问应用程序的主机不匹配。

1)检查你的.env 文件:

SESSION_DOMAIN=example.com
APP_URL=example.com

2. 检查 config/session.php

验证值以确保它们是正确的。

一些参考文献 = >

...
<head>
// CSRF for all ajax call
<meta name="csrf-token" content="\{\{ csrf_token() }}" />
</head>
...
...
<script>
// CSRF for all ajax call
$.ajaxSetup({ headers: { 'X-CSRF-TOKEN': jQuery('meta[name="csrf-token"]').attr('content') } });
</script>
...

如果你正在装载。Js,你必须在你的“ main”中用 csrf _ token 设置一个变量。Php 文件,在该文件中导入。并在 ajax 调用中使用变量。

Index.blade.php

...
...
<script src="\{\{ asset('js/anotherfile.js') }}"></script>
<script type="text/javascript">
var token = '\{\{ csrf_token() }}';
</script>

另一个文件 js

$.ajax({
url: 'yourUrl',
type: 'POST',
data: {
'_token': token
},
dataType: "json",
beforeSend:function(){
//do stuff
},
success: function(data) {
//do stuff
},
error: function(data) {
//do stuff
},
complete: function(){
//do stuff
}
});

只要序列化表单数据就可以解决问题了。

data: $('#form_id').serialize(),

你必须得到 CSRF 令牌. 。

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

做完同样的事情后上升,只需添加这个元标签 < meta name="csrf-token" content="\{\{ csrf_token() }}" >

在这之后也会出现错误,您可以检查 Ajax 错误,然后检查 Ajax 错误

$.ajax({
url: 'some_unknown_page.html',
success: function (response) {
$('#post').html(response.responseText);
},
error: function (jqXHR, exception) {
var msg = '';
if (jqXHR.status === 0) {
msg = 'Not connect.\n Verify Network.';
} else if (jqXHR.status == 404) {
msg = 'Requested page not found. [404]';
} else if (jqXHR.status == 500) {
msg = 'Internal Server Error [500].';
} else if (exception === 'parsererror') {
msg = 'Requested JSON parse failed.';
} else if (exception === 'timeout') {
msg = 'Time out error.';
} else if (exception === 'abort') {
msg = 'Ajax request aborted.';
} else {
msg = 'Uncaught Error.\n' + jqXHR.responseText;
}
$('#post').html(msg);
},
});

如果您忘记在 Ajax 提交请求(POST)中包含这个,也会发生此错误, ContentType: false, ProcessData: false,

这对于那些不需要表单的情况非常有用。

在页眉中使用:

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

在你的 JavaScript 代码中:

$.ajaxSetup({
headers: {
'X-CSRF-TOKEN': '<?php echo csrf_token() ?>'
}
});
formData = new FormData();
formData.append('_token', "\{\{csrf_token()}}");
formData.append('file', blobInfo.blob(), blobInfo.filename());
xhr.send(formData);

得到这个错误,即使我已经发送了 csrf 令牌。结果发现服务器上已经没有空间了。

在控制台上修复419未知状态的一个简单方法是将此脚本放在表单中。{ csrf _ field ()}

2019年 Laravel 更新,从来没有想过我会发布这个,但是对于那些像我一样使用浏览器在 Laravel 5.8或更高版本上获取 API 的开发者来说。您必须通过 header 参数传递令牌。

var _token = "\{\{ csrf_token }}";
fetch("\{\{url('add/new/comment')}}", {
method: 'POST',
headers: {
'X-CSRF-TOKEN': _token,
'Content-Type': 'application/json',
},
body: JSON.stringify(name, email, message, article_id)
}).then(r => {
return r.json();
}).then(results => {}).catch(err => console.log(err));

这对我很有效:

$.ajaxSetup({
headers: {
'X-CSRF-TOKEN': "\{\{ csrf_token() }}"
}
});

之后设置常规的 AJAX 调用。例如:

    $.ajax({
type:'POST',
url:'custom_url',


data:{name: "some name", password: "pass", email: "test@test.com"},


success:function(response){


// Log response
console.log(response);


}


});

我将 SESSION_SECURE_COOKIE设置为 true,所以登录时我的开发环境无法工作,所以我添加了 SESSION_SECURE_COOKIE=false 敬我的 Dev。我的错误是更改了 session.php 文件,而没有将变量添加到。Env 文件。

以宇宙程序员的名义

我用纯 js 发送 ajax,当我不在纯 js 中设置 ajax 的这个方法时,我理解 < < < xhr.setRequestHeader (“ Content-type”,“ application/x-www-form-urlencode”) > 我收到这个错误419。

纯 ajax 的完整方法是:

Let token = document.querySelector (‘ meta [ name = “ csrf-token”]’) . content;

让 xhr = new XMLHttpRequest () ;

// Open the connection
xhr.open("POST", "/seller/dashboard/get-restaurants");

//您必须在代码中设置这一行(如果不设置,则收到错误419) :

xhr.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
//* Set up a handler for when the task for the request is complete
xhr.onload = function () {
    

};


// Send the data.
xhr.send(`_token=${token}`);