如何解决如何在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中获取它。
另请参见
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。