【问题标题】:Ajax works only first time, When it is loading for second time it got CSRF token error. How to solve this issue?Ajax 仅第一次工作,第二次加载时出现 CSRF 令牌错误。如何解决这个问题?
【发布时间】:2019-09-19 01:03:15
【问题描述】:

在我的代码中,Ajax 第一次可以完美运行,但是当页面第二次加载 ajax 时它无法正常工作我第二次遇到 CSRF 403 错误。

这是我的控制器:

$csrf_name = $this->security->get_csrf_token_name();
$csrf_hash = $this->security->get_csrf_hash();
$output = array("draw" => $draw,"recordsTotal" => $total_records,"recordsFiltered" => $total_records,"data" => $data, $csrf_name => $csrf_hash); 
echo json_encode($output);
exit();

这里是s JS:

$(document).ready(function() {
            var csrf = jQuery('#csrf_hash').val();
            $.fn.dataTable.moment('DD/MM/YYYY');  
            $('#messages').DataTable({
                responsive: true,
                iDisplayLength: 50,
                "processing": true,
                "serverSide": true,
                "ajax": {
                    url : "<?php echo site_url("iot_lora/iot_lora_datatable_ajax") ?>",
                    type : 'POST',
                    "data": function(d) {
                        var frm_data = $('form').serializeArray();
                        $.each(frm_data, function(key, val) {
                        d[val.name] = val.value;
                       }); 
                     }
                },
                "fnDrawCallback" :  function(response) {
                        var new_csrf = '<?php echo $this->security->get_csrf_hash(); ?>';
                        //alert(new_csrf);
                        //$("#csrf_hash").val("");
                },
            });   
        });

还有我的 ajax 设置:

$(function($) {
        $.ajaxSetup({
            data: {
                '<?php echo $this->security->get_csrf_token_name(); ?>' : '<?php echo $this->security->get_csrf_hash(); ?>'
            }
        });

    });

【问题讨论】:

    标签: php ajax codeigniter datatables csrf


    【解决方案1】:

    希望对你有所帮助。

    在 header.php 文件中添加以下代码。

    <meta name="csrf-token" content="{{ csrf_token() }}">
    

    比在 ajax 的头部添加 X-CSRF-TOKEN。

    $.ajax({
        url         : "URL",
        type        : "POST/GET",
        dataType    : "JSON",
        data        : $("#FORMDATA").serialize(),
        headers     : {"X-CSRF-TOKEN" : $('meta[name="csrf-token"]').attr('content')},
        success     : function (res){
        },
        error       : function (err){
        }
    });
    

    【讨论】:

    • 我尝试了您的代码,但仍然无法正常工作,它显示相同的错误。
    • 你的意思是在控制器中创建一个新功能吧?
    • No not in controller create it in helpers.php file.
    • 如果可以的话请分享你的api方法和ajax函数以便更多的理解。
    【解决方案2】:
    <meta name="csrf-token" content="{{ csrf_token() }}">
     AND WRITE JQUERY CODE OUTSIDE DOCUMENT.READY FUNCTION
     var csrf = jQuery('#csrf_hash').val();
            $.fn.dataTable.moment('DD/MM/YYYY');  
            $('#messages').DataTable({
                responsive: true,
                iDisplayLength: 50,
                "processing": true,
                "serverSide": true,
                "ajax": {
                    url : "<?php echo site_url("iot_lora/iot_lora_datatable_ajax") ?>",
                    type : 'POST',
                    "data": function(d) {
                        var frm_data = $('form').serializeArray();
                        $.each(frm_data, function(key, val) {
                        d[val.name] = val.value;
                       }); 
                     }
                },
                "fnDrawCallback" :  function(response) {
                        var new_csrf = '<?php echo $this->security->get_csrf_hash(); ?>';
                        //alert(new_csrf);
                        //$("#csrf_hash").val("");
                },
            });
    

    【讨论】:

    • 添加你的 header.php
    • 我只在header.php文件中添加了
    猜你喜欢
    • 1970-01-01
    • 2014-11-20
    • 1970-01-01
    • 1970-01-01
    • 2018-07-10
    • 2018-01-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多