我在this帖子中使用了解决方案
我在我的网页上使用了这个解决方案并且部分工作。
基本上我有一个表格,每行都有一个链接,当我点击链接时,我通过AJAX检索数据并在另一个表格中显示这些数据。当我点击第一个链接然后抛出一个" 403 Forbidden"单击表中的其他链接时出错。
<div class="col-lg-4" id="media-sources-view">
<div id="result">
<table class="table table-hover hidden" id="xarticletab">
<tr>
<th>Title</th>
<th>Name</th>
</tr>
</table>
</div>
</div>
<script type="text/javascript">
$('#mashed_row a').click(function () {
var link_id = $(this).attr('link_id');
$.ajax({
type: 'POST',
url: '<?php echo base_url(); ?>main/explode_link',
data: {'<?php echo $this->security->get_csrf_token_name(); ?>' : '<?php echo $this->security->get_csrf_hash(); ?>', link_id},
dataType: 'json',
success : function(data) {
if(data){
var len = data.length;
var txt = "";
if(len > 0){
for(var i=0;i<len;i++){
if(data[i].title){
txt += "<tr><td>"+data[i].title+"</td><td>"+data[i].name+"</td></tr>";
}
}
if(txt != ""){
$("#xarticletab").append(txt).removeClass("hidden");
}
}
}
}
});
return false;
});
</script>
答案 0 :(得分:0)
这是因为每次POST请求后都会重新生成CSRF令牌。
首次输出页面时,javascript中的CSRF令牌有效但在第一次请求后会重新生成,但您的javascript代码仍然使用旧的。
禁用CSRF再生,它将使用相同的CSRF令牌直到它过期 - 默认7200秒(这会降低安全性,所以我不推荐它) - 在application / config / config.php中
$config['csrf_regenerate'] = false;
或重构您的javascript代码和处理ajax的php文件,以使用不需要CSRF令牌的GET请求。
要清除旧表行并填充新表,首先要制作一个正确的html表格布局:
<table class="table table-hover hidden" id="xarticletab">
<thead>
<tr>
<th>Title</th>
<th>Name</th>
</tr>
</thead>
<tbody>
</tbody>
</table>
和ajax代码:
$.ajax({
type: 'POST',
url: '<?php echo base_url(); ?>main/explode_link',
data: {'<?php echo $this->security->get_csrf_token_name(); ?>' : '<?php echo $this->security->get_csrf_hash(); ?>', link_id},
dataType: 'json',
success : function(data) {
if (data) {
// Clear table body rows
$('#xarticletab tbody').empty();
var len = data.length;
var txt = "";
if (len > 0) {
for (var i=0;i<len;i++) {
if (data[i].title) {
txt += "<tr><td>"+data[i].title+"</td><td>"+data[i].name+"</td></tr>";
}
}
if (txt != "") {
$('#xarticletab').removeClass('hidden');
// Append rows to table body
$("#xarticletab tbody").append(txt);
}
}
}
}
});