CakePHP3 ~ CSRF-token 第二个函数不匹配

CakePHP3 ~ CSRF-token mismatch on second function

我目前正在开发一个 JavaScript 可靠的系统,该系统与 CakePHP 3 框架一起工作,如 back-end。我的面板中的所有操作都在同一页面/url 上执行,它是一个one-page-application。目前我有一堆功能在工作,并决定是时候研究 CakePHP 3 的 CSRF-component 了。当我启用它时,我收到 400 错误,表明没有给出 CSRF-token。经过大量研究后,我找到了解决方案,即通过 FormMaker 或在我的 JQuery ajax 请求中手动实现令牌来解决这个问题。这很有效,所以我决定在下一个功能中也实现它。但正如您可能猜到的那样,这没有用。第二个 ajax 请求给出 CSRF-token 不匹配。请看下面我的代码:

我的第一个实际有效的请求:

function getSectionData(controller, method = null) {
    fetch("<?=$this->Url->build(['controller' => '']);?>" + "/" + controller + "/getSectionData", {
            method: 'POST',
            headers: {
                "Content-Type": "application/json",
                "X-CSRF-Token": <?= json_encode($this->request->param('_csrfToken')); ?>
            },
            body: JSON.stringify({
                method: method
            })
        })
            .then((res) =>
                res.json())
            .then((data) => {
                console.warn(data);
                let response = data.response;

                if (response.success == 1) {
                    // Action to do when data has been received
                    let method = response.method;
                    let rows = response.rows;

                    window[method](controller, rows);
                } else if (response.success == 0) {
                    // Message when an error occures

                }

            })
            .catch((err) => console.log(err))
}

最终,第二个功能在不到一秒后被激活:

function renderElement(element, id, data = null) {
    let path = "<?= $this->request->here; ?>" + "/renderElement/" + element;
    $('#' + id).load(path, {
        data: data, 
        headers: {
            "X-CSRF-Token": <?= json_encode($this->request->param('_csrfToken')); ?>
        }
    });
}

在这个函数中,我从另一个可以包含 data-elements 的文件中加载一个预设 HTML 元素,这就是它首先从控制器请求数据的原因。我使用与第一个函数相同的 headers 并且 CSRF-token 出现在控制台中。但它不起作用并抛出不匹配错误。我想知道为什么会出现此错误以及如何解决它,例如,我是否必须刷新它以及如何刷新它?

请注意,我使用的是 3.6 更新之前的 CakePHP 3 版本,它删除了 CSRF 组件并添加了 CRSF 中间件。

提前致谢。

jQuery.load() 函数不接受 AJAX 配置参数,第二个参数要么是回调,要么是定义要提交的 POST 数据的 object与请求一起。

您要么必须切换到使用可配置的 AJAX 请求(例如在您的第一个代码段中),要么全局配置 jQuery 以设置所需的 header所有 AJAX 个请求:

$.ajaxSetup({
    headers: {
        'X-CSRF-Token': <?= json_encode($this->request->param('_csrfToken')); ?>
    }
});

另见