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

そして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回リロードしても何も起こりません、そして時々私は2回入り、許可されていないことが起こります。

最も参考になるコメント

コメントを読んで、
私は問題をうまく解決しました。
ビューで
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 、これはデバッグが非常に難しいゴーストバグの1つです。 すでに何人かのユーザーが同じ問題を報告しており、これを引き起こしているものを見つけることができません。 ローカルマシンで同じエラーを再現することすらできません。 この問題を完全に修正するために、可能であればPRを支援し、提供していただければ幸いです。 ありがとう!

こんにちは、
私はこの問題に遭遇し、何時間もデバッグしようとしましたが、役に立ちませんでした。
回避策の1つは、ajaxをGETではなくPOSTリクエストとして設定することです。
これは私にとってはうまくいき、ログインページに追い出されることなくページを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

ChumperDatatableの問題https://github.com/Chumper/Datatable/issues/170を読んだばかりで、私たちに当てはまる可能性があります。

mgsmusは2014年9月16日にコメントしました
私はこの問題を抱えています。 私は「職人のサーブ」を介してPHPの組み込みWebサーバーを使用していました。 Apacheに切り替えたところ、問題は解決しました。 その理由は、組み込みサーバーがサポートしていないマルチスレッドにあると思います。

「職人サーブ」を使っている方はいますか?

「職人サーブ」を使用しています。 よく注意してください。 組み込みサーバーの使用は簡単ですが、実際の環境を表すことはできません。この後、代わりにApacheを使用することを検討します。

ありがとう、 @ yajra 。 ところで、私はあなたの提案によってcsrfトークンの問題を解決しました。 Laravelからのそのドキュメントを見逃しました。 HTMLビルダーでajaxリクエストタイプを変更する方法はどこにありますか?

@mrofi 、確認していただきありがとうございます。 この問題は、おそらく「職人のサーブ」が原因である可能性があります。

ajaxの場合、以下のように配列パラメーターを送信できます。

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

何人かのユーザーは、問題が「職人のサーブ」によるものであることを確認しました。 apache / nginxを使用すると、問題が修正されます。 ありがとう!

私はFedoraマシンでApacheを使用しており、hostsファイルを介してローカルで使用していますが、これとまったく同じ問題が発生しています。 何か案は?

私はこの小さな問題を次のように解決しました
置換:ajax: 'リソース'、

沿って:
ajax:{
url: 'リソース'、
ヘッダー:{'X-CSRF-TOKEN':トークン}、
dataType: 'JSON'、
beforeSend:関数(xhr){
xhr.setRequestHeader( 'Authorization');
}
}、

いくつかのヒント
1)AjaxはPOSTまたはGETを実行して呼び出す可能性があるため、任意のルートを構成する必要があります
`` `
Route :: any( 'campos / data'、 'C​​amposController @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": "/ resource"、
"エラー":function(reason){
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ヘッダーを使用して解決しました。 私はLaravelPassportを使用していますが、それが関連しているかどうかはわかりません。単純な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();
        });

`

ソリューションのthx。

このページは役に立ちましたか?
0 / 5 - 0 評価