【问题标题】:laravel 5 ajax, keep get 500 internal erro with csrf tokenlaravel 5 ajax,使用 csrf 令牌保持 500 内部错误
【发布时间】:2016-10-13 13:18:51
【问题描述】:

我想制作一个搜索程序来从庞大的数据表中获取数据。用户可以从到列,代码/代码和名称搜索数据(每个数据有1个代码/代码)。如果用户单击搜索按钮,使用 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>

搜索结果将显示在&lt;tbody&gt;,属性为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 放在&lt;head&gt; 标记处

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

使用该代码,我不断收到 500 内部错误。谁能找到问题?

【问题讨论】:

  • 把token作为输入隐藏字段
  • 把这个和你的表格一起{{csrf_field}}
  • 在您的 ajax 中,您的 URL 定义为 url: 'select_bu'。你在使用命名路由吗?如果此 Javascript 在页面中回显,您可能需要使用类似 url: '{!! route('url_to _submit to') !!}', 的内容。有关命名路线的更多信息:laravel.com/docs/5.2/routing#named-routes
  • @JustinOriginBroadband 使用命名路由仍然相同
  • 您是否尝试将 {{csrf_field}} 放入表单并删除元 csrf_token?结果如何?

标签: php ajax laravel


【解决方案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 设置中。无需将其作为 &lt;form&gt; 的一部分包含在您的 &lt;form&gt; 中,也无需将其作为参数作为您的 ajax 对象密钥对的一部分发送以在请求中发送。最有可能是由于两个_token 值在到达VerifyCsrfToken 中间件后相互冲突,导致$('input[name=_token]') 引用的_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/

【讨论】:

  • 我按照您对我的建议修复了我的代码,但不幸的是,我仍然收到 500 个内部错误
  • 解决了,我发现了问题。我的控制器上使用 elloquent 模型的问题。谢谢
【解决方案2】:

转储您的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 documentationForm,如果没记错的话。

【讨论】:

    猜你喜欢
    • 2017-04-10
    • 2018-06-19
    • 1970-01-01
    • 2018-07-21
    • 1970-01-01
    • 2015-09-20
    • 2014-09-22
    • 1970-01-01
    • 2019-12-05
    相关资源
    最近更新 更多