JSON表在第一次显示正常,在下次显示403错误

时间:2016-06-07 22:46:41

标签: php jquery json ajax

我在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>

1 个答案:

答案 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); 
                }
            }
        }
    }
 });