Laravel-datatables: 401 Tidak Sah

Dibuat pada 3 Sep 2015  ·  15Komentar  ·  Sumber: yajra/laravel-datatables

Saya memperbarui hari ini ke versi 5.11.7 dan saya mengalami beberapa kesalahan tidak sah secara acak dari ajax ketika saya masuk ke halaman di mana saya memiliki komponen Datatables.
Kode saya seperti ini

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

dan deklarasi yang dapat didata adalah

$(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 ] }
      ]
    });

});

ketika Unauthorized meledak, saya harus login ulang di aplikasi. dan itu terjadi secara acak: Saya dapat memuat ulang 6 kali halaman dan tidak terjadi apa-apa, dan terkadang saya masuk dua kali dan tidak sah terjadi.

Komentar yang paling membantu

Membaca komentar,
Saya memecahkan masalah dengan baik.
dalam tampilan
var token = '{{ csrf_token() }}';

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

`var tabel = $('#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();
        });

`

Semua 15 komentar

@mantrax314 , ini adalah salah satu bug hantu yang sangat sulit untuk di-debug. Beberapa pengguna telah melaporkan masalah yang sama dan tidak dapat menemukan apa pun yang menyebabkan hal ini. Saya bahkan tidak dapat mereproduksi kesalahan yang sama pada mesin lokal saya. Akan sangat bagus dan dihargai jika Anda dapat membantu dan memberikan PR jika memungkinkan untuk memperbaiki masalah ini sekali dan untuk selamanya. Terima kasih!

Halo,
Saya mengalami masalah ini dan mencoba men-debug selama berjam-jam tetapi tidak berhasil.
Tampaknya salah satu solusinya adalah mengatur ajax Anda sebagai permintaan POST alih-alih GET
Ini berhasil untuk saya dan saya menguji dengan menyegarkan halaman saya 50 kali tanpa dikeluarkan dari halaman login

Solusinya didasarkan pada masalah ini
https://github.com/yajra/laravel-datatables/issues/19

Sama dengan @Xyten saya menyelesaikan ini dengan menggunakan permintaan POST tetapi saya mendapatkan kesalahan dengan token CSRF saat menggunakan POST .. ada saran untuk itu? terima kasih btw.

@mrofi , ikuti dokumen untuk masalah token. http://laravel.com/docs/5.1/routing#csrf -x-csrf-token

Saya baru saja membaca masalah https://github.com/Chumper/Datatable/issues/170 di Chumper Datatable dan mungkin berlaku untuk kami.

mgsmus berkomentar pada 16 Sep 2014
Saya pernah mengalami masalah ini. Saya menggunakan server web bawaan PHP melalui "artisan serve". Saya beralih ke Apache dan masalahnya terpecahkan. Saya kira alasannya adalah multi-threading yang tidak didukung oleh server bawaan.

Apakah ada di antara kalian yang menggunakan "artisan serve"?

Saya menggunakan "servis tukang". Perhatikan baik-baik. Menggunakan server bawaan cukup mudah tetapi tidak dapat mewakili lingkungan nyata, saya akan mempertimbangkan untuk menggunakan Apache sebagai gantinya setelah ini..

Terima kasih @yajra . btw saya memecahkan masalah token csrf dengan saran Anda. Saya melewatkan dokumentasi itu dari Laravel. Di mana saya dapat menemukan cara untuk mengubah jenis permintaan ajax di pembuat html?

@mrofi , terima kasih atas konfirmasinya. Masalah ini mungkin benar-benar karena "servis tukang".

Untuk ajax, Anda dapat mengirim parameter array seperti di bawah ini.

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

Beberapa pengguna mengkonfirmasi bahwa masalah itu disebabkan oleh "servis tukang". Menggunakan Apache/nginx akan memperbaiki masalah. Terima kasih!

Saya menggunakan Apache pada mesin Fedora, menggunakan secara lokal melalui file host dan saya mengalami masalah yang sama persis. Ada ide?

Saya memecahkan masalah kecil ini sebagai berikut
menggantikan: ajax: 'sumber daya',

oleh:
ajax: {
url: 'sumber daya',
header: {'X-CSRF-TOKEN': token},
tipe data: 'JSON',
sebelumKirim: fungsi (xhr) {
xhr.setRequestHeader('Otorisasi');
}
},

Beberapa tips
1) Ajax mungkin menelepon melakukan POST atau GET sehingga Anda perlu mengonfigurasi rute Anda di APAPUN
```
Rute::any('campos/data','CamposController @data ')->name('campos.data');

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

$.ajaxSetup({
header: {
'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": "/sumber",
"kesalahan": fungsi(alasan) {
console.log("Terjadi kesalahan ! ");
// proses alasan di sini untuk mengetahui jenis kesalahan
// dan kemudian ambil tindakan yang tepat
}
```

Membaca komentar,
Saya memecahkan masalah dengan baik.
dalam tampilan
var token = '{{ csrf_token() }}';

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

`var tabel = $('#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 terima kasih atas solusinya, berhasil :)

Hai, saya juga mengalami masalah ini dan saya menyelesaikannya menggunakan header axios pada konfigurasi Ajax. Saya menggunakan Laravel Passport, saya tidak tahu apakah itu terkait, karena dengan panggilan aksio sederhana itu berfungsi

bootstrap saya.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');
}

skrip DataTables saya

$(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' }
                ]
            });
        });

Membaca komentar,
Saya memecahkan masalah dengan baik.
dalam tampilan
var token = '{{ csrf_token() }}';

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

`var tabel = $('#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 atas solusinya.

Apakah halaman ini membantu?
0 / 5 - 0 peringkat