Laravel-datatables: 401未经授权

创建于 2015-09-03  ·  15评论  ·  资料来源: yajra/laravel-datatables

我今天更新到 5.11.7 版本,当我进入我有 Datatables 组件的页面时,我遇到了一些来自 ajax 的随机未经授权的错误。
我的代码是这样的

    public function anyData()
    {
      $Patient = Patient::select('*')->withTrashed();
      return \Datatables::of($Patient)->make(true);
    }

并且数据表声明是

$(document).ready(function() {
    $('#dataTables-patients').DataTable({
      responsive: true,
      processing: true,
      serverSide: true,
      ajax: base_url+'/patient/data',
      language:{
        url:base_url+'/js/dataTables.Spanish.json'
      },
      columns:[
        {data:'dni', name:'dni'},
        {data:'first_name', name:'first_name'},
        {data:'last_name', name:'last_name'},
        {data:'birthday', name:'birthday'},
        {data:'id', name:'id'},
        {data:'active', name:'active'},
      ],
      "columnDefs": [{
        "targets": 4,
        "data": "id",
        "render": function ( data, type, row ) {
          if(row.active=="0"){
            return '<a class="btn btn-primary" href="'+base_url+'/patient/show/'+data+'">'+patient.view+'</a>'+
                   '<a class="btn btn-success respatient" data-id="'+data+'" href="#" >'+patient.restore+'</a>';
          }else{
            return '<a class="btn btn-primary" href="'+base_url+'/patient/show/'+data+'">'+patient.view+'</a>'+
                   '<a class="btn btn-danger delpatient" data-id="'+data+'" href="#" >'+patient.delete+'</a>';
          }
        }

      },
      { "orderable": false, "targets": [ 4 ] },
      { "bSearchable": false, "aTargets": [ 5 ] },
      { "visible": false,  "targets": [ 5 ] }
      ]
    });

});

当未经授权爆炸时,我必须重新登录该应用程序。 它是随机发生的:我可以重新加载页面 6 次但什么也没有发生,有时我进入两次并发生未经授权的情况。

最有用的评论

看了评论,
我很好地解决了这个问题。
在视图中
var token = '{{ csrf_token() }}';

ajax: { url:'$url', type:'post', data: { '_token': token } },

`var table = $('#myTable');

        oTable = table.dataTable({
            processing: true,
            serverSide: true,
            order: [[1, 'desc']],
            buttons: [
                { extend: 'print',  className: 'btn dark btn-outline'       },
                { extend: 'copy',   className: 'btn red btn-outline'        },
                { extend: 'pdf',    className: 'btn green btn-outline'      },
                { extend: 'excel',  className: 'btn yellow btn-outline'     },
                { extend: 'csv',    className: 'btn purple btn-outline'     },
                { extend: 'colvis', className: 'btn dark btn-outline', text: 'Columns'}
            ],
            ajax: {
                url:'$url',
                type:'post',
                data: {
                    '_token': token
                }
            },
            $col,
            \"oLanguage\": {
                \"sEmptyTable\":   \"No se encontraron resultados\",
                \"sInfo\":         \"Mostrando _START_ a _END_ de _TOTAL_ filas\",
                \"sInfoEmpty\":    \"No se encontraron resultados\",
                \"sInfoFiltered\": \"(Filtrado de _MAX_ total de filas)\",
                \"sLengthMenu\":   \"Ver _MENU_ filas\",
                \"sSearch\":       \"Buscar:\",
                \"sZeroRecords\":  \"No se encontraron resultados\"
            },
            \"aoColumnDefs\": [
                { \"bSortable\": false, \"aTargets\": [ 0,-1 ] }

,
{ \"iDataSort\": 1, \"aTargets\": [ 0 ] },

                { \"sWidth\": \"20px\",   \"aTargets\": [ 0,-1 ]  },


            ]
        });


        table.on(\"keyup\", \"input[type=search]\", function () {
            /* Filter on the column (the index) of this element */
            oTable.fnFilter(this.value, $(\"thead input\").index(this));
        });

        $('#sample_1_tools > li > a.tool-action').on('click', function() {
            var action = $(this).attr('data-action');
            //console.log(action);
            oTable.DataTable().button(action).trigger();
        });

`

所有15条评论

@mantrax314 ,这是一个很难调试的幽灵错误。 几个用户已经报告了同样的问题,但找不到任何导致此问题的原因。 我什至无法在本地机器上重现相同的错误。 如果您能提供帮助并提供 PR 以一劳永逸地解决此问题,我们将不胜感激。 谢谢!

你好,
我遇到了这个问题并尝试调试了几个小时但无济于事。
似乎一种解决方法是将您的 ajax 设置为 POST 请求而不是 GET
这对我有用,我通过刷新页面 50 次进行测试,而不会被踢出登录页面

解决方法是基于这个问题
https://github.com/yajra/laravel-datatables/issues/19

@Xyten相同,我通过使用 POST 请求解决了这个问题,但是在使用 POST 时出现 CSRF 令牌错误。有什么建议吗? 谢谢顺便说一句。

@mrofi ,请按照文档进行令牌问题。 http://laravel.com/docs/5.1/routing#csrf -x-csrf-token

我刚刚阅读了关于 Chumper Datatable 的问题https://github.com/Chumper/Datatable/issues/170 ,可能适用于我们。

mgsmus 于 2014 年 9 月 16 日发表评论
我遇到过这个问题。 我通过“artisan serve”使用 PHP 的内置 Web 服务器。 我切换到Apache,问题解决了。 我猜原因是内置服务器不支持的多线程。

你们中有人使用“工匠服务”吗?

我正在使用“工匠服务”。 请注意。 使用内置服务器很容易,但它不能代表真实的环境,我会考虑在此之后使用 Apache 来代替..

谢谢, @yajra 。 顺便说一句,我通过您的建议解决了 csrf 令牌问题。 我错过了 Laravel 的文档。 在哪里可以找到在 html builder 中更改 ajax 请求类型的方法?

@mrofi ,感谢您的确认。 这个问题可能真的是由于“工匠服务”。

对于 ajax,您可以向它发送一个数组参数,如下所示。

->ajax([
  'url' => 'url',
  'type' => 'post'
])

一些用户确认该问题是由于“工匠服务”造成的。 使用 apache/nginx 将解决此问题。 谢谢!

我在 Fedora 机器上使用 apache,通过主机文件在本地使用,我遇到了同样的问题。 有任何想法吗?

我解决了这个小问题如下
替换:ajax:'资源',

经过:
阿贾克斯:{
网址:'资源',
标头:{'X-CSRF-TOKEN':令牌},
数据类型:'JSON',
发送前:函数(xhr){
xhr.setRequestHeader('授权');
}
},

一些技巧
1) Ajax 可能会调用 POST 或 GET,因此您需要在 ANY 中配置您的路由
```
Route::any('campos/data','CamposController @data ')->name('campos.data');

2) Dont forget add the token before the ajax calling (in my case is Laravel)

$.ajaxSetup({
标题:{
'X-CSRF-TOKEN':'{{csrf_token()}}'
}
});

3) I have that issue in using php artisan on Windows. If you use on Linux or Apache you wont have errors. 
4) Error 401 is becouse the session was expired. You need a login again. You could handler the error and take some action

"ajax": "/资源",
“错误”:功能(原因){
console.log("遇到错误!");
// 在这里处理原因以知道错误的类型
// 然后采取适当的行动
}
```

看了评论,
我很好地解决了这个问题。
在视图中
var token = '{{ csrf_token() }}';

ajax: { url:'$url', type:'post', data: { '_token': token } },

`var table = $('#myTable');

        oTable = table.dataTable({
            processing: true,
            serverSide: true,
            order: [[1, 'desc']],
            buttons: [
                { extend: 'print',  className: 'btn dark btn-outline'       },
                { extend: 'copy',   className: 'btn red btn-outline'        },
                { extend: 'pdf',    className: 'btn green btn-outline'      },
                { extend: 'excel',  className: 'btn yellow btn-outline'     },
                { extend: 'csv',    className: 'btn purple btn-outline'     },
                { extend: 'colvis', className: 'btn dark btn-outline', text: 'Columns'}
            ],
            ajax: {
                url:'$url',
                type:'post',
                data: {
                    '_token': token
                }
            },
            $col,
            \"oLanguage\": {
                \"sEmptyTable\":   \"No se encontraron resultados\",
                \"sInfo\":         \"Mostrando _START_ a _END_ de _TOTAL_ filas\",
                \"sInfoEmpty\":    \"No se encontraron resultados\",
                \"sInfoFiltered\": \"(Filtrado de _MAX_ total de filas)\",
                \"sLengthMenu\":   \"Ver _MENU_ filas\",
                \"sSearch\":       \"Buscar:\",
                \"sZeroRecords\":  \"No se encontraron resultados\"
            },
            \"aoColumnDefs\": [
                { \"bSortable\": false, \"aTargets\": [ 0,-1 ] }

,
{ \"iDataSort\": 1, \"aTargets\": [ 0 ] },

                { \"sWidth\": \"20px\",   \"aTargets\": [ 0,-1 ]  },


            ]
        });


        table.on(\"keyup\", \"input[type=search]\", function () {
            /* Filter on the column (the index) of this element */
            oTable.fnFilter(this.value, $(\"thead input\").index(this));
        });

        $('#sample_1_tools > li > a.tool-action').on('click', function() {
            var action = $(this).attr('data-action');
            //console.log(action);
            oTable.DataTable().button(action).trigger();
        });

`

@jarm-mcs 感谢您的解决方案,它工作:)

嗨,我也遇到了这个问题,我在 Ajax 配置上使用 axios 标头解决了这个问题。 我正在使用 Laravel Passport,我不知道它是否相关,因为通过简单的 axios 调用它可以工作

我的 bootstrap.js

window.axios = require('axios');

window.axios.defaults.headers.common['X-Requested-With'] = 'XMLHttpRequest';

/**
 * Next we will register the CSRF Token as a common header with Axios so that
 * all outgoing HTTP requests automatically have it attached. This is just
 * a simple convenience so we don't have to attach every token manually.
 */

let token = document.head.querySelector('meta[name="csrf-token"]');

if (token) {
    window.axios.defaults.headers.common['X-CSRF-TOKEN'] = token.content;
} else {
    console.error('CSRF token not found: https://laravel.com/docs/csrf#csrf-x-csrf-token');
}

我的数据表脚本

$(function() {
            $('#users-table').DataTable({
                processing: true,
                serverSide: true,
                ajax: {
                    'url':'{!! route('api.games.index') !!}',
                    'headers':window.axios.defaults.headers.common
                },
                columns: [
                    { data: 'id', name: 'id' },
                    { data: 'name', name: 'name' },
                    { data: 'created_at', name: 'created_at' },
                    { data: 'updated_at', name: 'updated_at' }
                ]
            });
        });

看了评论,
我很好地解决了这个问题。
在视图中
var token = '{{ csrf_token() }}';

ajax: { url:'$url', type:'post', data: { '_token': token } },

`var table = $('#myTable');

        oTable = table.dataTable({
            processing: true,
            serverSide: true,
            order: [[1, 'desc']],
            buttons: [
              { extend: 'print',  className: 'btn dark btn-outline'       },
              { extend: 'copy',   className: 'btn red btn-outline'        },
              { extend: 'pdf',    className: 'btn green btn-outline'      },
              { extend: 'excel',  className: 'btn yellow btn-outline'     },
              { extend: 'csv',    className: 'btn purple btn-outline'     },
              { extend: 'colvis', className: 'btn dark btn-outline', text: 'Columns'}
          ],
            ajax: {
                url:'$url',
                type:'post',
                data: {
                    '_token': token
                }
            },
            $col,
            \"oLanguage\": {
              \"sEmptyTable\":   \"No se encontraron resultados\",
              \"sInfo\":         \"Mostrando _START_ a _END_ de _TOTAL_ filas\",
              \"sInfoEmpty\":    \"No se encontraron resultados\",
              \"sInfoFiltered\": \"(Filtrado de _MAX_ total de filas)\",
              \"sLengthMenu\":   \"Ver _MENU_ filas\",
              \"sSearch\":       \"Buscar:\",
              \"sZeroRecords\":  \"No se encontraron resultados\"
          },
          \"aoColumnDefs\": [
              { \"bSortable\": false, \"aTargets\": [ 0,-1 ] }

,
{“iDataSort”:1,“aTargets”:[0]},

              { \"sWidth\": \"20px\",   \"aTargets\": [ 0,-1 ]  },


            ]
        });


        table.on(\"keyup\", \"input[type=search]\", function () {
          /* Filter on the column (the index) of this element */
          oTable.fnFilter(this.value, $(\"thead input\").index(this));
      });

        $('#sample_1_tools > li > a.tool-action').on('click', function() {
            var action = $(this).attr('data-action');
            //console.log(action);
            oTable.DataTable().button(action).trigger();
        });

`

thx 的解决方案。

此页面是否有帮助?
0 / 5 - 0 等级

相关问题

vipin733 picture vipin733  ·  3评论

macnux picture macnux  ·  3评论

kamrava picture kamrava  ·  3评论

Mopster picture Mopster  ·  3评论

techguydev picture techguydev  ·  3评论