如何修复 XMLHttpRequest 中的 419 未知状态?
How to fixed 419 unknown status in XMLHttpRequest?
在向 url 发送 post 请求时,我的 XMLHttpRequest()
出现错误。当我检查我的 console.log 时,它显示
this line of code:
xhr.send();
Error: Failed to load resource: the server responded with a status of 419 (unknown status)
这是我的脚本代码,仅使用纯 javascript:
<!-- Get Parameters for gclid or token when user visits the website -->
<script>
window.onload = function() {
try {
var url_string = (window.location.href).toLowerCase();
var url = new URL(url_string);
// Get Gclid
var token = url.searchParams.get("gclid");
// gclid expires in 6 hours
document.cookie = `gclid=${gclid}; max-age=21600`;
// Sending a get request to laravel controller
var base_url = window.location.origin; // get the base url
var params = "gclid=" + gclid;
let xhr = new XMLHttpRequest();
xhr.open("POST", base_url+"/storetrackvisit?"+params, true);
xhr.send();
} catch (err) {
console.log("Issues with Parsing URL Parameter's - " + err);
}
}
</script>
我正在尝试在此 XMLHttpRequest()
中传递参数,以便当用户具有此参数时。
示例:
https://www.test.com/?gclid=312
它将向我的 storetrackvisit
页面发送一个 post 请求以及参数并将其保存到数据库:
https://www.test.com/storetrackvisit?gclid=312
let xhr = new XMLHttpRequest();
xhr.open("POST", base_url+"/storetrackvisit?"+params, true);
xhr.send();
这样它将像这样保存到我的控制器中:
流量控制器
public function storeParams(Request $request)
{
$traffic = new TrafficTracking();
if ($request->has('gclid')) { // check if key = gclid
$traffic->traffic_type = 'gclid'; // store the key in db
$traffic->traffic_value = $request->gclid;
}
if ($traffic->value === null) {
return response()->noContent();
}
$traffic->ip_address = $request->ip();
$traffic->domain = $request->getHttpHost();
$traffic->save();
}
web.php
// Traffic Controller
Route::post('/storetrackvisit', 'TrafficController@storeParams')->name('user.store.trackvisit');
我的 xhr.send();
返回状态 419(未知状态)似乎有什么错误?
是不是因为我的XMLHttpRequest
在javascript里面没有传csrf token?如果是这样,我如何在 XMLHttpRequest
中传递它,或者是什么导致了 419(未知状态)?
通常 419 Error
表示请求中缺少 CSRF 令牌。您可以通过两种方式轻松处理它。
- 如果您不发送任何敏感信息,请将路由更改为
GET
。
- 在您的请求中包含一个 CSRF 令牌。
我将解释第 2 点,您如何在请求中包含 CSRF 令牌。
现在,还有两种方法可以包含 CSRF 令牌:
- 在header中调用它。
- 创建一个包含令牌的HTML输入字段。
1.在Headers
中调用
您可以像这样在 header 中定义 CSRF 令牌,
<meta name="csrf-token" content="{{ csrf_token() }}">
然后在JavaScript中访问它并像这样设置headers,
xhr.setRequestHeader(header, value);
2。创建一个包含 token
的 HTML 输入字段
您可以像这样创建一个包含标记的输入字段,
<!-- It's a laravel blade directive, which creates an input field containing token -->
@csrf
<!-- or manually do it -->
<input type="hidden" name="_token" value="{{ csrf_token() }}">
在您的 JavaScript 中获取它并像这样将其作为参数发送,
let csrfToken = document.getElementsByName("_token");
params += "&_token=" + csrfToken;
在向 url 发送 post 请求时,我的 XMLHttpRequest()
出现错误。当我检查我的 console.log 时,它显示
this line of code:
xhr.send();
Error: Failed to load resource: the server responded with a status of 419 (unknown status)
这是我的脚本代码,仅使用纯 javascript:
<!-- Get Parameters for gclid or token when user visits the website -->
<script>
window.onload = function() {
try {
var url_string = (window.location.href).toLowerCase();
var url = new URL(url_string);
// Get Gclid
var token = url.searchParams.get("gclid");
// gclid expires in 6 hours
document.cookie = `gclid=${gclid}; max-age=21600`;
// Sending a get request to laravel controller
var base_url = window.location.origin; // get the base url
var params = "gclid=" + gclid;
let xhr = new XMLHttpRequest();
xhr.open("POST", base_url+"/storetrackvisit?"+params, true);
xhr.send();
} catch (err) {
console.log("Issues with Parsing URL Parameter's - " + err);
}
}
</script>
我正在尝试在此 XMLHttpRequest()
中传递参数,以便当用户具有此参数时。
示例:
https://www.test.com/?gclid=312
它将向我的 storetrackvisit
页面发送一个 post 请求以及参数并将其保存到数据库:
https://www.test.com/storetrackvisit?gclid=312
let xhr = new XMLHttpRequest();
xhr.open("POST", base_url+"/storetrackvisit?"+params, true);
xhr.send();
这样它将像这样保存到我的控制器中:
流量控制器
public function storeParams(Request $request)
{
$traffic = new TrafficTracking();
if ($request->has('gclid')) { // check if key = gclid
$traffic->traffic_type = 'gclid'; // store the key in db
$traffic->traffic_value = $request->gclid;
}
if ($traffic->value === null) {
return response()->noContent();
}
$traffic->ip_address = $request->ip();
$traffic->domain = $request->getHttpHost();
$traffic->save();
}
web.php
// Traffic Controller
Route::post('/storetrackvisit', 'TrafficController@storeParams')->name('user.store.trackvisit');
我的 xhr.send();
返回状态 419(未知状态)似乎有什么错误?
是不是因为我的XMLHttpRequest
在javascript里面没有传csrf token?如果是这样,我如何在 XMLHttpRequest
中传递它,或者是什么导致了 419(未知状态)?
通常 419 Error
表示请求中缺少 CSRF 令牌。您可以通过两种方式轻松处理它。
- 如果您不发送任何敏感信息,请将路由更改为
GET
。 - 在您的请求中包含一个 CSRF 令牌。
我将解释第 2 点,您如何在请求中包含 CSRF 令牌。
现在,还有两种方法可以包含 CSRF 令牌:
- 在header中调用它。
- 创建一个包含令牌的HTML输入字段。
1.在Headers
中调用您可以像这样在 header 中定义 CSRF 令牌,
<meta name="csrf-token" content="{{ csrf_token() }}">
然后在JavaScript中访问它并像这样设置headers,
xhr.setRequestHeader(header, value);
2。创建一个包含 token
的 HTML 输入字段您可以像这样创建一个包含标记的输入字段,
<!-- It's a laravel blade directive, which creates an input field containing token -->
@csrf
<!-- or manually do it -->
<input type="hidden" name="_token" value="{{ csrf_token() }}">
在您的 JavaScript 中获取它并像这样将其作为参数发送,
let csrfToken = document.getElementsByName("_token");
params += "&_token=" + csrfToken;