2

我正在将 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
}

这工作得很好,直到启用缓存。

问题在于view.html.php,当 Joomla 使用其内部缓存时,该文件已使用已设置的令牌进行缓存——因此,每当浏览器请求该页面时,它都会将缓存的令牌连同它一起拉出,这意味着控制器将返回一个无效的令牌错误。

我知道在早期的 Joomla 构建缓存完全不起作用。除了禁用 Joomla 缓存之外,有没有办法在 Joomla 2.5+ 中完成这项工作?我找不到从缓存中排除单个视图的任何方法。

4

4 回答 4

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'); ?>
于 2013-06-08T05:18:14.333 回答
1

有时我使用 Ajax 和 Joomla 并真的没有这个问题。好吧,也许你的工作方式,也许最好尝试一种不同的缓存方式,所以如果你真的没有希望,只需从 Joomla 分叉系统 - 缓存,并在你的分叉上让它不缓存你不缓存的东西想。如果在您的项目中可以处理您的缓存方式,您也可以不使用 Joomla Cache 并将其与 Varnish 或类似内容一起使用。

我认为它应该比你现在做的更好:Joomla 有一个小组来包含另一种使用 AJAX 的“标准”方式,你可以在这里看到一个概念证明:

在这里讨论

另外,关于使用 Ajax 的另一种方法在这里

于 2013-06-08T02:18:27.933 回答
1

通过查看您的方法签名JSession::getFormToken()您应该能够通过调用getFormToken(true).

这应该可以避免您遇到的任何缓存问题。

于 2013-06-08T20:20:10.853 回答
0

我在 joomla 中使用非常相似的设置执行此操作的方式是使用 JavaScript 注入值。页面在没有令牌的情况下被缓存,JavaScript 在发出请求之前添加它

您可以使用 cookie 或其他 ajax 请求传递值。饼干最适合我

于 2013-06-07T21:03:15.107 回答