Codeigniter 启用CI 2.0.x、ajax和CSRF时出现500个错误

Codeigniter 启用CI 2.0.x、ajax和CSRF时出现500个错误,codeigniter,jquery,codeigniter-2,Codeigniter,Jquery,Codeigniter 2,在提交ajax请求时,我不断收到500个错误。如果我在配置中关闭CSRF,那么发布工作就正常了。一旦我打开它,然后我又得到了500的错误 在config.php中,我设置了以下值: $config['csrf_token_name'] = 'csrf_test_name'; $config['csrf_cookie_name'] = 'csrf_cookie_name'; 我确实加载了jquery cookie,在我的jquery文件中,我有以下代码: $('#reorder').sorta

在提交ajax请求时,我不断收到500个错误。如果我在配置中关闭CSRF,那么发布工作就正常了。一旦我打开它,然后我又得到了500的错误

在config.php中,我设置了以下值:

$config['csrf_token_name'] = 'csrf_test_name';
$config['csrf_cookie_name'] = 'csrf_cookie_name';
我确实加载了jquery cookie,在我的jquery文件中,我有以下代码:

 $('#reorder').sortable({
    opacity: '0.5',
    update: function(e, ui){
        newOrder = $( "#reorder" ).sortable('serialize');
        csrf_cookie_name = $.cookie('csrf_cookie_name')
        console.log(newOrder);
        console.log(csrf_cookie_name);
        $.ajax({
            csrf_cookie_name: $.cookie('csrf_cookie_name'),
            url: "/client/saveOrder",
            type: "POST",
            data: newOrder,
            // complete: function(){},
            success: function(feedback){
                console.log('success');
                $("#feedback").html(feedback);
                //$.jGrowl(feedback, { theme: 'success' });
            }
        });
    }
});
csrf_cookie_name的console.log现在是:cd660b153522bef89dc53f7f95cd6b1d,所以我得到了它看起来的值

最后是客户端中一个非常简单的函数,用于处理数据。通常情况下,我会将其中的一部分分离到模型中,但我一直试图保持它的简单,直到我让它工作

function saveOrder()
    {
        $items = $this->input->post('item');
        echo '<br/>Items2:' . var_dump($items);
        $total_items = count($this->input->post('item'));

        for($item = 0; $item < $total_items; $item++ )
        {

            $data = array(
                'pageid' => $items[$item],
                'rank' => $item
            );

            $this->db->where('pageid', $data['pageid']);

            $this->db->update('pages', $data);

//          echo '<br />'.$this->db->last_query();

        }
函数saveOrder()
{
$items=$this->input->post('item');
echo“
Items2:”.var_dump($items); $total_items=count($this->input->post('item'); 对于($item=0;$item<$total_items;$item++) { $data=数组( “pageid”=>$items[$item], “排名”=>$item ); $this->db->where('pageid',$data['pageid']); $this->db->update('pages',$data); //回显“
”。$this->db->last_query(); }

视图中没有使用任何表单。它只是一个UL,其中包含一组LI,我正在四处拖动以进行排序。

有两种解决方案。两种方法都有效。检查这些帖子-包含您需要的所有信息


我过去在无意中使用
标记而不是使用CI的本机
form_open()
时遇到过问题。为了创建隐藏的令牌字段,这需要存在。这里还有一些很好的建议:。

我几天前遇到了这个问题,解决方法很简单(至少对我来说)。
更改:
$.ajax({
csrf\u cookie\u name:$.cookie('csrf\u cookie\u name')


$.ajax({

csrf\u test\u name:$.cookie('csrf\u cookie\u name')

我终于让它工作了。下面是我用来实现它的jquery:

您必须同时使用令牌的名称和cookie的名称,并使其成为post对象的一部分。因此,令牌名称=cookie名称,并确保在末尾添加一个(&a)

$('#reorder').sortable({
        opacity: '0.5',
        update: function(e, ui){
            newOrder = 'csrf_test_name=' + $.cookie('csrf_cookie_name') + '&';
            newOrder += $( "#reorder" ).sortable('serialize');
            console.log(newOrder);
            $.ajax({
                url: "/client/saveOrder",
                type: "POST",
                data: newOrder,
                csrf_test_name: $.cookie('csrf_cookie_name'),
                // complete: function(){},
                success: function(feedback){
                    console.log('success');
                    $("#feedback").html(feedback);
                    //$.jGrowl(feedback, { theme: 'success' });
                }
            });
        }
    });

我已经试过了。我甚至把名字从csrf\u cookie\u改成了csrf\u token\u,想知道这是否会带来不同?