提问者:小点点

Laravel 5.5:403在使AJAX立柱时被禁止


我已经在这个问题上坚持了两天了,我在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(&quot;pushProfile&quot;) }}\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"
}

我错过什么了吗?谢谢!


共1个答案

匿名用户

我找到了解决办法,哦,上帝,它是如此简单,我为自己感到羞耻:

我使用刀片路由从.js文件调用AJAX。将调用移到刀片文件中解决了整个问题,因为刀片路由只呈现在.blade.php文件中...

我把这个问题留在这里,以防有人遇到同样的麻烦:)