我已经在这个问题上坚持了两天了,我在StackOverflow和Laracasts上寻找的所有解决方案都没有结果。
我将Laravel5.5与jQuery一起使用,并在Firefox中进行测试。
我的AJAX GET调用工作正常,但是,当我尝试在数据库中推入一个条目时,我得到一个403错误。
我的标头包含CSRF令牌:
<meta name="csrf-token" content="{{ csrf_token() }}">
为在我的控制器中调用的每个表创建模型:
public function pushProfile(Request $request){
$userid = \Auth::user()->id;
$data = $request->message;
$stat = \App\Character::where('owner', $userid)->first();
$mess = \App\Message::firstOrCreate([
'posterID' => $userid,
'loc_x' => '0',
'loc_y' => '0',
'characterID' => $stat->id,
'type' => 'profile'
]);
$mess->content = $data;
$mess->save();
return response()->json(['success'=>'Message has been saved!']);
}
这里是AJAX调用,它基本上检查我的Quilljsdelta
。这个delta
是一个JSON对象,用于格式化来自所见即所得的消息。然后每隔5秒,它就应该尝试把它推送到我的数据库。
我知道Quilljs方面工作良好,因为我的三角洲显示在我的控制台。但是POST调用本身似乎由于某种原因没有通过身份验证?(这只是我的猜测,对我来说,这似乎是它发送403的唯一原因。)
setInterval(function() {
if (change.length() > 0) {
console.log('Saving changes', change);
/* AJAX setup */
$.ajaxSetup({
headers: {
'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
}
});
$.ajax({
headers: {
'Content-Type':'application/json'
},
method: 'POST',
url: '{{ url("/pushProfile") }}',
data: {
message:
{
doc: JSON.stringify(quill.getContents())
},
_token: $('meta[name="csrf-token"]').attr('content')
},
dataType: 'JSON',
error: function(jqXHR, textStatus, errorThrown) {
console.log(JSON.stringify(jqXHR));
console.log("AJAX error: " + textStatus + ' : ' + errorThrown);
},
success: function (data) {
$(".writeinfo").append(data.msg);
console.log("Success!!!");
}
});
change = new Delta();
}
}, 5*1000);
为了确保问题不是来自CSRF,我做了一些过分的尝试,在尝试先在ajaxSetup中设置令牌,然后仅在AJAX数据中设置后,我在两者中都分配了它。这些情景都没有改变什么。
当然,我在我的post路由上分配了'Web'中间件来检查上面提到的CSRF令牌。我使用的路线如下:
Route::group(['middleware' => ['web']], function () {
Route::post('/pushProfile','MessageSend@pushProfile')->name('pushProfile');
});
我还尝试将URL分配为:
url: '/pushProfile',
不幸的是,无济于事...这只是返回一个404而不是我当前拥有的403:
{
"readyState":4,
"responseText":"<!DOCTYPE HTML PUBLIC \"-//IETF//DTD HTML 2.0//EN\">\n<html>
<head>\n<title>403 Forbidden</title>\n</head>
<body>\n<h1>Forbidden</h1>\n
<p>You don't have permission to access
/folder/public/{{ route("pushProfile") }}\n
on this server.<br />\n</p>\n
<hr>\n
<address>Apache/2.4.35 (Win64) PHP/7.2.10 Server at localhost Port 80</address>\n
</body>
</html>\n",
"status":403,
"statusText":"Forbidden"
}
我错过什么了吗?谢谢!
我找到了解决办法,哦,上帝,它是如此简单,我为自己感到羞耻:
我使用刀片路由从.js文件调用AJAX。将调用移到刀片文件中解决了整个问题,因为刀片路由只呈现在.blade.php文件中...
我把这个问题留在这里,以防有人遇到同样的麻烦:)