ajax - 当我在 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'},
]
});
解决方案
您在第二个请求中遇到 403 错误,因为跨站点请求伪造 (CSRF) 会为每个请求生成一个唯一值。
对于解决方案,转到“ application/config/config.php ”并将“ $config['csrf_protection'] ”更改为false。这是停止在每个请求上生成新的哈希值。
推荐阅读
- git - 如何将您自己的个人 GitHub 存储库克隆(“分叉”)到单独的新分支中的新存储库?
- sql - SQL CASE 与 CASE
- sql - 在加入 2 个表后,根据来自另一列的值查找一列中的最小值
- python - AttributeError:“NoneType”对象没有属性“get_screenshot_as_file”
- python - 为什么二进制编码会给我一整列 0?
- c# - 如何使用嵌套数组/列表遍历 JSON 响应
- javascript - 通过javascript动态设置标签内的引导数据切换
- oracle - 如何解决 oracle 存储过程中的无效标识符
- vue.js - vue中如何自定义结构指令
- angular - 将 nx 工作区升级到 v12 后,angular.json 也没有迁移到 angular v12