当我尝试使用Laravel控制器方法处理AJAX请求时,为什么会出现这个异常?

3

我在PHP和Laravel方面是绝对的新手,我有以下问题。

我认为自己通过以下代码使用JQuery执行AJAX POST请求:

jQuery.ajax({
  url: '/doSearch',
  type: 'POST',
  dataType: 'json',
  //data: $form.serialize(),
  success: function(data){
   console.info('ssssssssssiiii',data);
     },
     error: function(data, b){
   console.info('erroreeeeee');
     }
 });

这个简单的控制器方法处理这个POST请求:

public function doSearch(){
    echo 'SEARCHED';
}

需要返回的视图必须包含搜索字符串。

问题在于我得到了这个错误信息:

http://localhost:8000/doSearch 500 (Internal Server Error)

这是由一个TokenMismatchException引起的异常,Laravel堆栈跟踪中可以看到类似于以下内容:

in VerifyCsrfToken.php line 68
at VerifyCsrfToken->handle(object(Request), object(Closure)) in Pipeline.php line 137
at Pipeline->Illuminate\Pipeline\{closure}(object(Request)) in Pipeline.php line 33
at Pipeline->Illuminate\Routing\{closure}(object(Request)) in ShareErrorsFromSession.php line 49
at ShareErrorsFromSession->handle(object(Request), object(Closure)) in Pipeline.php line 137
at Pipeline->Illuminate\Pipeline\{closure}(object(Request)) in Pipeline.php line 33
at Pipeline->Illuminate\Routing\{closure}(object(Request)) in StartSession.php line 64
at StartSession->handle(object(Request), object(Closure)) in Pipeline.php line 137
at Pipeline->Illuminate\Pipeline\{closure}(object(Request)) in Pipeline.php line 33
at Pipeline->Illuminate\Routing\{closure}(object(Request)) in AddQueuedCookiesToResponse.php line 37
at AddQueuedCookiesToResponse->handle(object(Request), object(Closure)) in Pipeline.php line 137
at Pipeline->Illuminate\Pipeline\{closure}(object(Request)) in Pipeline.php line 33
at Pipeline->Illuminate\Routing\{closure}(object(Request)) in EncryptCookies.php line 59
at EncryptCookies->handle(object(Request), object(Closure)) in Pipeline.php line 137
at Pipeline->Illuminate\Pipeline\{closure}(object(Request)) in Pipeline.php line 33
at Pipeline->Illuminate\Routing\{closure}(object(Request)) in Pipeline.php line 104
at Pipeline->then(object(Closure)) in Router.php line 644
at Router->runRouteWithinStack(object(Route), object(Request)) in Router.php line 618
at Router->dispatchToRoute(object(Request)) in Router.php line 596
at Router->dispatch(object(Request)) in Kernel.php line 267
at Kernel->Illuminate\Foundation\Http\{closure}(object(Request)) in Pipeline.php line 53
at Pipeline->Illuminate\Routing\{closure}(object(Request)) in CheckForMaintenanceMode.php line 46
at CheckForMaintenanceMode->handle(object(Request), object(Closure)) in Pipeline.php line 137
at Pipeline->Illuminate\Pipeline\{closure}(object(Request)) in Pipeline.php line 33
at Pipeline->Illuminate\Routing\{closure}(object(Request)) in Pipeline.php line 104
at Pipeline->then(object(Closure)) in Kernel.php line 149
at Kernel->sendRequestThroughRouter(object(Request)) in Kernel.php line 116
at Kernel->handle(object(Request)) in index.php line 54
at require_once('C:\xampp\htdocs\www.betrivius.it\application\public\index.php') in server.php line 21

可能是什么问题?我该如何解决这个问题?

3个回答

4

您应该为Ajax请求设置令牌。将其放在主布局中:

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

并在每个请求中执行此JS代码:

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

2

您需要在ajax请求中附加csrf-token...这里是链接

要添加一个csrf-token,您可以使用csrf_token()方法,该方法将自动创建一个名为'_token'的隐藏字段,并将其值设置为'token',然后在ajax中,您可以使用它的值。

例如,在您的表单中的html代码中,您需要添加:

{{csrf_token()}}

在ajax中:

jQuery.ajax({
  url: '/doSearch',
  type: 'POST',
  dataType: 'json',
  //data: $form.serialize(),
  success: function(data){
   console.info('ssssssssssiiii',data);
     },
     error: function(data, b){
   console.info('erroreeeeee');
     },
   beforeSend:function(xhr){
      xhr.setRequestHeader('X-CSRF-TOKEN',$('_token').val());
   }
 });

2
如果你正在编写 .php 页面而不是 .html 页面,请尝试以下方法:
<meta name="csrf-token" content="<?php echo csrf_token(); ?>">

替代方案:

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

对我来说它有效。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接