我正在使用Joomla进行项目,并且发生了一些Ajax请求以填充数据。我在PHP视图中生成一个Joomla会话令牌,并将其添加到Ajax请求端点的URL上,该端点也是一个PHP页面,并在返回数据之前验证令牌。
这样的事情:
// view.html.php
$script = "var ajaxurl = 'index.php?task=ajaxFunction&".JFactory::getSession()->getFormToken()."=1';";
$document->addScriptDeclaration($script);
// ajax.js
var request = new Request.JSON({
url: ajaxurl,
onException: function(headerName, value) {
// etc.
}
});
// controller
public function ajaxfunction()
{
JRequest::checkToken('get') or die( 'Invalid Token!' );
// do other stuff
}
这样可以正常工作,直到启用缓存。
问题是当Joomla使用其内部缓存时,view.html.php
文件被缓存并且已经设置了令牌 - 所以当浏览器请求页面时,它会随之拉出缓存的令牌,这意味着控制器将返回无效的令牌错误。
我知道在之前的Joomla构建缓存中并没有起作用。有没有办法让这个工作在Joomla 2.5+,只是禁用Joomla缓存?我找不到任何方法可以从缓存中排除单个视图。
答案 0 :(得分:2)
也许您可能希望将请求发送为POST而不是GET,后者不会使用Joomla缓存。
<强> ajax.js 强>
var userToken = document.getElementsByTagName("input")[0].name;
var request = new Request.JSON({
url: 'index.php?task=ajaxFunction&'+ userToken +'=1',
onException: function(headerName, value) {
// etc.
}
onComplete: function(res) {
// etc.
}
}).post({});
<强>控制器强>
JRequest::checkToken('get') or die( 'Invalid Token!' );
将其粘贴在模板文件的顶部(在所有其他输入标记之前),它将创建一个包含令牌的隐藏输入字段,该字段最终将替换为渲染上的非缓存字符
<强> TMPL /如default.php 强>
<?= JHtml::_('form.token'); ?>
答案 1 :(得分:1)
有时我使用Ajax和Joomla并且确实没有这个问题。好吧,也许你工作的方式,也许最好尝试一种不同的缓存方式,所以如果你真的没有希望,只需从Joomla派生系统 - 缓存,并在你的fork上进行不缓存你不想要的东西。如果在您的项目中可以处理缓存的方式,您也可以不使用Joomla Cache并将其与Varnish或类似的一起使用。
我认为它应该比你正在做的更好:Joomla有一个小组可以使用另一种“标准”方式来使用AJAX,你可以在这里看到一个概念证明:
在这里讨论
此外,关于使用Ajax的另一个方法是
答案 2 :(得分:1)
通过查看JSession::getFormToken()
的{{3}},您应该可以通过调用getFormToken(true)
来强制使用新令牌。
这可以避免您遇到的任何缓存问题。
答案 3 :(得分:0)
我在joomla中使用非常相似的设置来实现它的方式是使用JavaScript注入值。在没有令牌的情况下缓存页面,JavaScript在发出请求之前添加它
您可以使用Cookie或其他ajax请求传递值。饼干效果最好我