首页 > 解决方案 > 当我在 Ajax 中发布第二个查询时,我得到了 403 禁止。(Ajax + codeigniter 3 + 数据表)

问题描述

我正在使用 Codeginiter3 并尝试了 datatable-ajax。我意识到这个错误来自 CSRF 保护,我将我的 CSRF 名称和哈希码发送到我的 ajax 帖子。我解决了这个问题,但是在搜索数据表或转到其他页面时再次遇到相同的错误。

我的控制器:

public function tempList(){

        $columns = array(
            0 =>'id',
            1 =>'message',

        );

        $limit = $this->input->post('length');
        $start = $this->input->post('start');
        $order = $columns[$this->input->post('order')[0]['column']];
        $dir = $this->input->post('order')[0]['dir'];

        $totalData = $this->TemplateModel->allposts_count();

        $totalFiltered = $totalData;

        if(empty($this->input->post('search')['value']))
        {
            $posts = $this->TemplateModel->allposts($limit,$start,$order,$dir);
        }
        else {
            $search = $this->input->post('search')['value'];

            $posts =  $this->TemplateModel->posts_search($limit,$start,$search,$order,$dir);

            $totalFiltered = $this->TemplateModel->posts_search_count($search);
        }

        $data = array();
        if(!empty($posts))
        {
            foreach ($posts as $post)
            {

                $nestedData['id'] = $post->id;
                $nestedData['message'] = $post->message;
                $data[] = $nestedData;

            }
        }

        $json_data = array(
            "draw"            => intval($this->input->post('draw')),
            "recordsTotal"    => intval($totalData),
            "recordsFiltered" => intval($totalFiltered),
            "data"            => $data
        );

        echo json_encode($json_data);


    }

我的模型:

 function allposts_count()
    {
        $query = $this
            ->db
            ->get($this->table);

        return $query->num_rows();

    }

    function allposts($limit,$start,$col,$dir)
    {
        $query = $this
            ->db
            ->limit($limit,$start)
            ->order_by($col,$dir)
            ->get($this->table);

        if($query->num_rows()>0)
        {
            return $query->result();
        }
        else
        {
            return null;
        }

    }

    function posts_search($limit,$start,$search,$col,$dir)
    {
        $query = $this
            ->db
            ->like('id',$search)
            ->or_like('message',$search)
            ->limit($limit,$start)
            ->order_by($col,$dir)
            ->get($this->table);


        if($query->num_rows()>0)
        {
            return $query->result();
        }
        else
        {
            return null;
        }
    }

    function posts_search_count($search)
    {
        $query = $this
            ->db
            ->like('id',$search)
            ->or_like('message',$search)
            ->get($this->table);

        return $query->num_rows();
    }

我的观点:

<div class="container container-margin">
    <div class="row">
        <div class="col-sm-12">
            <div class="mb-3 mt-3">
                <h1 class="text-center">Templates</h1>
            </div>
            <div class="card">
                <div class="card-body">
                    <table id="tempTable" class="display" style="width:100%">
                        <thead>
                        <tr>
                            <th>ID</th>
                            <th>Message</th>
                        </tr>
                        </thead>


                    </table>
                </div>
            </div>
        </div>
    </div>
</div>

我的JS:

 $('#tempTable').DataTable({
            'processing': true,
            'serverSide': true,
            'ajax': {
                'url': '<?php echo base_url('Dashboard/tempList') ?>',
                "dataType" : "json",
                "type" : "POST", // ajax source
                "data":{  '<?php echo $csrfName ?>'    : '<?php echo $csrfHash ?>' }



            },

            'columns': [
                {data: 'id'},
                {data: 'message'},

            ]

        });

错误图片: 错误图像

标签: ajaxcodeigniterdatatable

解决方案


您在第二个请求中遇到 403 错误,因为跨站点请求伪造 (CSRF) 会为每个请求生成一个唯一值。

对于解决方案,转到“ application/config/config.php ”并将“ $config['csrf_protection'] ”更改为false。这是停止在每个请求上生成新的哈希值。


推荐阅读