laravel 5 ajax,使用csrf令牌

时间:2016-06-13 07:52:58

标签: php ajax laravel

我想制作一个搜索程序来从大数据表中获取数据。用户可以从列,代码/代码和名称中搜索数据(每个数据都有1个代码/ kode)。如果用户单击搜索按钮,使用AJAX向服务器发送请求,则客户端获取结果并将其显示在表中。

这是我的观点:

<div class="modal-body">
    <div class="form-inline form-inline" style="margin-bottom: 10px">
         {!! Form::select('jenis-select',['Kode BU','Nama BU'],null,['class' => 'form-control']) !!}
         {!! Form::text('value-select','',['class' => 'form-control']) !!}
         <button type="button" id="cari-bu" class="btn btn-default">Cari</button>
    </div>
    <table class="table">
        <thead>
            <tr>
                <th>Kode BU</th>
                <th>Nama BU</th>
            </tr>
        </thead>
        <tbody id="hasil-cari"></tbody>
    </table>
</div>

搜索结果将显示在<tbody>上,地址为id="hasil-cari" 这是我的ajax:

$(document).ready(function () {
    $.ajaxSetup({
        headers: {'X-CSRF-Token': $('meta[name=_token]').attr('content')}
    });
    $('#cari-bu').click(function () {
        $.ajax({
            url: 'select_bu',
            type: 'post',
            data: {'_token': $('input[name=_token]').val(),
                'jenis': $('select[name=jenis-select]').val(),
                'value': $('input[name=value-select]').val()
            },
            success: function (data) {
                $('#hasil-cari').html(data);
            }
        });
    });
});

这是处理AJAX的控制器:

public function postSelect() {
        if (Request::ajax()) {
            $input = Input::all();
            if ($input['jenis'] == 0) {
                $hasil = Daftarbu::where('kodebu', $input['value'])->get();
            } elseif ($input['jenis'] == 1) {
                $hasil = Daftarbu::where('namabu','LIKE','%'.$input['value'].'%')->get();
            }
            $hasilAkh = '<tr>';
            foreach ($hasil as $dHasil){
                $hasilAkh .= '<td>'.$dHasil->kodebu.'</td><td>'.$dHasil->namabu.'</td>';
            }
            $hasilAkh .= '</tr>';
            return $hasilAkh;
        }
    }

我的路线:

Route::post('select_bu','Pelayanan@postSelect');

我已将此meta置于<head>代码

<meta name="_token" content="{!! csrf_token() !!}"/>

使用该代码我会得到500内部错误。有谁能找到问题?

2 个答案:

答案 0 :(得分:1)

routes.php

    Route::post('/select_bu',['as'=>'select_bu','uses'=>'Pelayanan@postSelect']);

在您的Javascript中:

    $(document).ready(function () {

        $.ajaxSetup({
            headers: {'X-CSRF-Token': $('meta[name="_token"]').attr('content')}
        });

        $('#cari-bu').click(function () {
            $.ajax({
                url: '{!! route('select_bu') !!}',
                type: 'post',
                data: 'jenis': $('select[name="jenis-select"]').val(),
                      'value': $('input[name="value-select"]').val()
                },
                success: function (data) {
                    $('#hasil-cari').html(data);
                }
            });
        });
    });

您已将$.ajaxSetup({})加载到您的ajax设置中。没有必要将它作为<form>的一部分包含在内,或作为一个参数发送,作为ajax对象密钥对的一部分发送请求。最有可能的错误是由于两个_token值在到达VerifyCsrfToken中间件后相互冲突而发生的,因为_token引用的$('input[name=_token]')似乎没有得到匹配?

在那个注释中,应该写出选择器:

    $('input[name="_token"]')

我已在我提供的代码中更正此内容。

了解更多信息:

https://laravel.com/docs/5.2/routing#named-routes

https://laravel.com/docs/5.2/routing#csrf-x-csrf-token

https://api.jquery.com/attribute-equals-selector/

答案 1 :(得分:0)

转储您的routes.php,可能是您设法避免加载包含CSRF检查的web中间件。

在5.2中,每次请求都只执行维护中间件。其他所有内容如cookie,会话和CSRF都已移至Web中间件组。

您可能需要以下内容:

Route::group(['middleware' => 'web'], function () {
    // ...
});

此外,为我们运行并转储生成的路线php artisan route:list并显示这些结果。

最后,您是否可以仔细检查您的HTML表单实际上是否格式正确(没有双关语)。您可能没有任何开放form标记,例如:

{!! Form::open(['url' => 'foo/bar', 'method' => 'post']) !!}
    {{-- Form::select --}}
{!! Form::close() }}

Relevant documentation Form,如果没有记错的话。