Laravel-datatables: 401 nicht Autorisiert

Erstellt am 3. Sept. 2015  ·  15Kommentare  ·  Quelle: yajra/laravel-datatables

Ich habe heute auf Version 5.11.7 aktualisiert und ich habe einen zufällig nicht autorisierten Fehler von Ajax, wenn ich auf die Seite gehe, auf der ich eine Datatables-Komponente habe.
Mein Code ist so

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

und die Datentabellen-Deklaration ist

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

});

Wenn Unauthorized explodiert, muss ich mich erneut in der App anmelden. und es passiert zufällig: ich kann 6 mal die seite neu laden und passiert nichts, und manchmal gebe ich zwei mal ein und unautorisiert passiert.

Hilfreichster Kommentar

Lesen Sie die Kommentare,
Ich habe das Problem gut gelöst.
in der Ansicht
var token = '{{ csrf_token() }}';

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

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

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

`

Alle 15 Kommentare

@mantrax314 , dies ist ein Ghost-Bug, der wirklich schwer zu debuggen ist. Mehrere Benutzer haben das gleiche Problem bereits gemeldet und können nichts finden, was dies verursacht. Ich kann den gleichen Fehler nicht einmal auf meinem lokalen Computer reproduzieren. Es wäre großartig und geschätzt, wenn Sie helfen und nach Möglichkeit eine PR bereitstellen könnten, um dieses Problem ein für alle Mal zu beheben. Danke!

Hallo,
Ich bin auf dieses Problem gestoßen und habe stundenlang versucht, es zu debuggen, aber ohne Erfolg.
Es scheint, dass eine Problemumgehung darin besteht, Ihr Ajax als POST-Anforderung anstelle von GET festzulegen
Das hat bei mir funktioniert und ich habe es getestet, indem ich meine Seite 50 Mal aktualisiert habe, ohne auf die Anmeldeseite geworfen zu werden

Die Problemumgehung basiert auf diesem Problem
https://github.com/yajra/laravel-datatables/issues/19

Dasselbe gilt für @Xyten. Ich habe das mit der POST-Anfrage gelöst, aber ich bekomme einen Fehler mit dem CSRF-Token, wenn ich POST verwende. Irgendwelche Vorschläge dafür? danke btw.

@mrofi , folgen Sie den Dokumenten für Token-Probleme. http://laravel.com/docs/5.1/routing#csrf -x-csrf-token

Ich habe gerade die Ausgabe https://github.com/Chumper/Datatable/issues/170 auf Chumper Datatable gelesen und könnte auf uns zutreffen.

mgsmus kommentierte am 16. September 2014
Ich hatte dieses Problem. Ich habe den integrierten Webserver von PHP über "Artisan Serve" verwendet. Ich bin auf Apache umgestiegen und das Problem ist gelöst. Ich denke, der Grund ist Multi-Threading, das der integrierte Server nicht unterstützt.

Benutzt einer von euch "Artisan Serve"?

Ich verwende "artisan serve". Gut beachten. Die Verwendung des eingebauten Servers ist einfach genug, aber er kann die reale Umgebung nicht darstellen. Ich werde danach in Betracht ziehen, stattdessen Apache zu verwenden.

Danke, @yajra . Übrigens habe ich das Csrf-Token-Problem durch Ihren Vorschlag gelöst. Ich habe diese Dokumentation von Laravel vermisst. Wo kann ich den Ajax-Anforderungstyp im HTML-Builder ändern?

@mrofi , danke für die Bestätigung. Dieses Problem ist möglicherweise wirklich auf "handwerklichen Aufschlag" zurückzuführen.

Für Ajax können Sie einen Array-Parameter wie unten senden.

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

Mehrere Benutzer bestätigten, dass das Problem auf „artisan serve“ zurückzuführen war. Die Verwendung von Apache/nginx behebt das Problem. Danke!

Ich verwende Apache auf einem Fedora-Computer, lokal über die Hosts-Datei und habe genau das gleiche Problem. Irgendwelche Ideen?

Ich habe dieses kleine Problem wie folgt gelöst
ersetzt: ajax: 'ressource',

durch:
ajax: {
url: 'ressource',
Header: {'X-CSRF-TOKEN': Token},
Datentyp: 'JSON',
beforeSend: Funktion (xhr) {
xhr.setRequestHeader('Autorisierung');
}
},

Einige Hinweise
1) Ajax ruft möglicherweise POST oder GET auf, sodass Sie Ihre Route in ANY konfigurieren müssen
```
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({
Überschriften: {
'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": "/ressource",
"Fehler": Funktion (Grund) {
console.log("Fehler aufgetreten ! ");
// Grund hier verarbeiten, um die Art des Fehlers zu erfahren
// und dann entsprechende Maßnahmen ergreifen
}
```

Lesen Sie die Kommentare,
Ich habe das Problem gut gelöst.
in der Ansicht
var token = '{{ csrf_token() }}';

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

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

        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 danke für die Lösung, es funktioniert :)

Hallo, ich hatte dieses Problem auch und habe es mit Axios-Headern in der Ajax-Konfiguration gelöst. Ich benutze Laravel Passport, ich weiß nicht, ob es verwandt ist, weil es mit einem einfachen Axios-Aufruf funktioniert

meine 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');
}

mein DataTables-Skript

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

Lesen Sie die Kommentare,
Ich habe das Problem gut gelöst.
in der Ansicht
var token = '{{ csrf_token() }}';

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

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

        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 für die lösung.

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen

Verwandte Themen

sangnguyenplus picture sangnguyenplus  ·  3Kommentare

vipin733 picture vipin733  ·  3Kommentare

hohuuhau picture hohuuhau  ·  3Kommentare

jackrsantana picture jackrsantana  ·  3Kommentare

techguydev picture techguydev  ·  3Kommentare