如何在CakePHP中在每个Ajax调用之前动态添加Csfr令牌

问题描述

我正在使用CakePHP 3.6。我有一个函数,它将使用AJAX调用返回一些数据。该功能将从我网站的任何页面调用。就像一个按钮在那里,单击该按钮时,模态将带有一些数据。这些数据将来自AJAX调用。所以现在我面临的问题是Csrf令牌。如果我从可提供表单的页面上单击,则此AJAX调用可以正常工作,因为该表单存在Csrf令牌。但是,当我尝试从没有可用表格的页面上单击时,AJAX会给出Csrf错误。因为没有为该页面添加Csrf。

这是我的按钮单击和Ajax调用功能的样子

Sub StockChartsBySubsector()
    Dim HTMLDoc As New HTMLDocument
    Dim objTable As Object,lRow As Long
    Dim lngTable As Long,lngRow As Long
    Dim lngCol As Long,ActRw As Long
    Dim stockList As Variant,stock As Variant
    Dim objIE As InternetExplorer
    Set objIE = New InternetExplorer
    
    stockList = Array("DJUSHP","DJUSOL","DJUSOI","DJUSPL")
    
    For Each stock In stockList
        objIE.Visible = False
        objIE.navigate "https://stockcharts.com/freecharts/sectorsummary.html?&G=SECTOR_" & stock & "&O=1"
        Do Until objIE.readyState = 4 And Not objIE.Busy
            DoEvents
        Loop
        
        Application.Wait (Now + TimeValue("0:00:03")) 'wait for java script to load
        
        HTMLDoc.body.innerHTML = objIE.document.body.innerHTML
        With HTMLDoc
            Set objTable = .getElementsByTagName("table")
            For lngTable = 0 To objTable.Length - 1
                For lngRow = 0 To objTable(lngTable).Rows.Length - 1
                    For lngCol = 0 To objTable(lngTable).Rows(lngRow).Cells.Length - 1
                        ThisWorkbook.Sheets("Sheet1").Cells(ActRw + lngRow + 1,lngCol + 1) = objTable(lngTable).Rows(lngRow).Cells(lngCol).innerText
                    Next lngCol
                Next lngRow
                ActRw = ActRw + objTable(lngTable).Rows.Length + 1
            Next lngTable
        End With
    Next stock
    objIE.Quit
End Sub

因此,可以在每次调用此AJAX网址之前生成Csrf令牌。或任何其他方式来执行此操作。谢谢

解决方法

您可以在视图模板(例如在布局中)从请求对象获得令牌,以使其在全球范围内可用:

<script>
var csrfToken = <?= json_encode($this->request->getParam('_csrfToken')) ?>;
// ...
</script>

然后您可以轻松地在AJAX请求中使用它:

$.ajax({
    headers: {
        'X-CSRF-Token': csrfToken
    },// ...
});

或者,如果您已经有了一些JS cookie解析器,则可以从名为csrfToken的cookie中获取它。

另请参见