【问题标题】:Why am I getting a TokenMismatchException with Laravel and JQuery Sortable?为什么我会在 Laravel 和 JQuery Sortable 中收到 TokenMismatchException?
【发布时间】:2017-11-10 21:01:43
【问题描述】:

更新 我已经根据我得到的答案稍微改变了问题

在用户通过 JQuery 的可排序库操作表格后,我正在尝试保存行的顺序。

<div class="nametag-layout">
        <table class="table table-striped pagin-table table-bordered">
            <thead>
                <tr>
                    <td>Duration</td>
                    <td>Intent</td>
                    <td>Module</td>
                    <td>Outputs</td>
                    <td>Inputs</td>
                    <td>Logistics</td>              
                </tr>
            </thead>
            <tbody>
            @foreach($mods as $key => $value)
                <tr class="table-tr draggable" data-id="{!!$value->id!!}">
                    <td>{{ $value->mod_duration }}</td>
                    <td>{{ $value->mod_intent }}</td>
                    <td>{{ $value->mod_module }}</td>
                    <td>{{ $value->mod_output }}</td>
                    <td>{{ $value->mod_input }}</td>
                    <td>{{ $value->mod_logistics }}</td>
                    <td>                            
                        <a class="btn btn-small btn-info" style="margin:auto; display:block;" href="{{ URL::to('mods/' . $value->id . '/edit') }}">Edit</a>
                    </td>
                </tr>
            @endforeach
            </tbody>
        </table>
    </div>

在表格被操作之后,一个 js 函数获取行的新顺序并通过调用传递它。

$( "tbody" ).sortable({ 
                    stop: function (event, ui) {
                        var ids = new Array();
                        $('tr', this).each(function () {
                            ids.push($(this).data('id'));
                        });
                        $.get(window.location.href.split('?')[0] + "/sort", {ids: ids});
                    }
            });

我的控制器中的排序函数获取这些值并解析它们,然后将其保存到数据库中,以便保存新的顺序。

public function sort() 
{
        $ids = request()->get('ids');
        if ($ids != null) {
            foreach ($ids as $i => $id) {
                $value = Mod::find($id);
                $value->sort = $i;
                $value->save();
            }
        } 
}

每次我刷新页面时,它都不会保存我将行移动到的顺序。检查 chrome 检查器并检查 XHR 过滤器显示,每次移动一行时,排序功能都会触发,但每次触发时,都会发生“VerifyCsrfToken 中的 TokenMismatchException”错误。我假设 js 函数实际上并没有将值传递给控制器​​,或者我搞砸了调用。

我还在“VerifyCsrfToken.php”中的 $except 参数中添加了“/sort”,以临时解决我遇到的 csrf 问题。

我的路线是这样的:

Route::get('/sort',array('as'=>'strawdog.sort','uses'=>'StrawdogController@sort'));

当我完成所有这些后,ajax 调用正在将数据发送到控制器,在使用 chrome 检查器上的 XHR 过滤器进行检查之后,但是每当刷新行时,它会返回到行的原始顺序而不是被操纵的秩序。

基本上,我做错了什么?

我尝试过的事情:

我尝试更改我的 js 函数以匹配控制器(post/get):

$.post(window.location.href.split('?')[0] + "/sort", {ids: ids});

public function sort() 
{
        $ids = request()->post('ids');
...

将两者都更改为“get”参数只会导致它调用我编写的另一个函数。将两者都更改为“post”参数只会再次返回“TokenMismatchException”错误。


我尝试了另一个选项,将 js 函数更改为“get”:

$.get(window.location.href.split('?')[0] + "/sort", {ids: ids});

还有要获取的函数:

$ids = request()->get('ids');

并删除了与get参数冲突的函数。然后我编写了一个显示函数来处理重定向到'/sort'。

public function show()
{
    return redirect('/sort');
}

返回 chrome 检查器并检查 XHR 过滤器表明它正在传递值,但排序函数返回“RouteCollection.php 第 179 行中的 NotFoundHttpException”错误。

作为参考,我的路线如下所示: Route::get('strawdog/sort',array('as'=>'strawdog.sort','uses'=>'StrawdogController@sort'));

【问题讨论】:

  • 使用$.post()阅读post..$.get()阅读get..所以使用$.get()get('ids')$.post()post('ids')
  • 更改为:$.post(window.location.href.split('?')[0] + "/sort", {ids: ids});匹配控制器只返回相同的错误。将我的控制器更改为 $.get 会导致它调用另一个函数而不是排序函数。

标签: php jquery ajax laravel


【解决方案1】:

Laravel 框架有 csrf 保护。见https://laravel.com/docs/5.4/csrf

你可以添加

var token = '{{csrf_token()}}';
$.post(window.location.href.split('?')[0] + "/sort", {ids: ids,_token:token}); 

在您的 ajax 数据中或在 Laravel 文档中查看解决方案

【讨论】:

  • 你能举个例子说明如何将它添加到我的 ajax 数据中吗?
  • 查看编辑后的代码,代码应该写在blade文件中
  • 我得到'使用未定义的常量 csrf_token - 假定为'csrf_token'
  • 很抱歉,这是一个函数{{csrf_token()}} 不是常量
  • 我已将其添加到我所拥有的内容中,它不再抛出任何错误,但似乎没有将行顺序保存到数据库中。
【解决方案2】:

在您的 VerifyCsrfToken.php 中间件中

这样做(添加任何你想crsf例外的路由)

class VerifyCsrfToken extends BaseVerifier
{
    /**
     * The URIs that should be excluded from CSRF verification.
     *
     * @var array
     */
    protected $except = [
        '/sort'  // add the correct route here
    ];
}

【讨论】:

  • 我在VerifyCsrfToken.php 中添加了'/sort',并将所有参数更改为'get',它似乎通过了,但它仍然没有保存行的顺序。
猜你喜欢
  • 1970-01-01
  • 2016-11-15
  • 2023-04-05
  • 2016-08-21
  • 2014-07-04
  • 2020-06-06
  • 2018-12-26
  • 2021-03-05
  • 2013-07-13
相关资源
最近更新 更多