Laravel-datatables: 401 Неавторизованный

Созданный на 3 сент. 2015  ·  15Комментарии  ·  Источник: yajra/laravel-datatables

Сегодня я обновился до версии 5.11.7, и у меня возникла случайная несанкционированная ошибка из-за ajax, когда я захожу на страницу, где у меня есть компонент Datatables.
Мой код такой

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

и объявление datatable

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

});

когда Unauthorized взрывается, я должен повторно войти в приложение. причем происходит рандомно: могу 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, \"цели\": [ 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, но я получаю сообщение об ошибке с токеном CSRF при использовании POST .. есть предложения по этому поводу? спасибо кстати.

@mrofi , следуйте документам по проблеме с токеном. http://laravel.com/docs/5.1/routing#csrf -x-csrf-токен

Я только что прочитал вопрос https://github.com/Chumper/Datatable/issues/170 в Chumper Datatable и может быть применим к нам.

mgsmus прокомментировал сен 16, 2014
У меня была эта проблема. Я использовал встроенный веб-сервер PHP через «ремесленную службу». Я переключился на Apache, и проблема решена. Я предполагаю, что причина в многопоточности, которую встроенный сервер не поддерживает.

Кто-нибудь из вас, ребята, использует «ремесленную подачу»?

Я использую «ремесленную подачу». Хорошо подмечено. Использовать встроенный сервер достаточно просто, но он не может отображать реальную среду, после этого я рассмотрю возможность использования Apache.

Спасибо, @yajra . Кстати, я решил проблему с токеном csrf по вашему предложению. Я пропустил эту документацию от Laravel. Где я могу найти способ изменить тип запроса ajax в html builder?

@mrofi , спасибо за подтверждение. Эта проблема может быть действительно из-за «ремесленной службы».

Для ajax вы можете отправить ему параметр массива, как показано ниже.

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

Несколько пользователей подтвердили, что проблема возникла из-за «ремесленной подачи». Использование apache/nginx решит проблему. Спасибо!

Я использую apache на компьютере с Fedora, используя локально через файл hosts, и у меня точно такая же проблема. Любые идеи?

Я решил эту небольшую проблему следующим образом
заменяет: ajax: 'ресурс',

от:
аякс: {
URL: 'ресурс',
заголовки: {'X-CSRF-TOKEN': токен},
тип данных: 'JSON',
перед отправкой: функция (xhr) {
xhr.setRequestHeader('Авторизация');
}
},

Некоторые советы
1) Ajax может вызывать выполнение POST или GET, поэтому вам нужно настроить свой маршрут в ЛЮБОМ
```
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

"аякс": "/ресурс",
"ошибка": функция (причина) {
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, \"цели\": [ 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 спасибо за решение, оно работает :)

Привет, у меня тоже была эта проблема, и я решил ее, используя заголовки axios в конфигурации Ajax. Я использую 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');
}

мой скрипт DataTables

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

`

Спасибо за решение.

Была ли эта страница полезной?
0 / 5 - 0 рейтинги

Смежные вопросы

hohuuhau picture hohuuhau  ·  3Комментарии

sangnguyenplus picture sangnguyenplus  ·  3Комментарии

alejandri picture alejandri  ·  3Комментарии

kamrava picture kamrava  ·  3Комментарии

FilipeBorges1993 picture FilipeBorges1993  ·  3Комментарии