PHP中的会话令牌由Joomla缓存

时间:2013-06-05 18:32:00

标签: php session caching joomla

我正在使用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缓存?我找不到任何方法可以从缓存中排除单个视图。

4 个答案:

答案 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请求传递值。饼干效果最好我