2

プロジェクトに Joomla を使用していますが、データを入力するためにいくつかの Ajax リクエストが発生しています。PHP ビューで Joomla セッション トークンを生成し、これを PHP ページでもある Ajax 要求エンドポイントの URL に追加し、データを返す前にトークンを検証します。

このようなもの:

// 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.phpJoomla が内部キャッシュを使用する場合、ファイルが既に設定されたトークンでキャッシュされることです。そのため、ブラウザーがページを要求するたびに、キャッシュされたトークンを一緒にプルします。つまり、コントローラーは無効なトークン エラーを返します。

以前の Joomla ビルドでは、完全にキャッシングが機能しなかったことを私は知っています。Joomlaキャッシュを無効にする以外に、Joomla 2.5以降でこれを機能させる方法はありますか? 単一のビューをキャッシュから除外する方法が見つかりません。

4

4 に答える 4

2

Joomla キャッシングを使用しない GET ではなく、POST として要求を送信することをお勧めします。

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

のメソッド シグネチャを見ると、JSession::getFormToken()を呼び出して新しいトークンを強制できるはずですgetFormToken(true)

これにより、発生しているキャッシュの問題を回避できます。

于 2013-06-08T20:20:10.853 に答える
0

非常によく似た設定で joomla で行う方法は、JavaScript で値を注入することです。ページはトークンなしでキャッシュされ、JavaScript はリクエストを行う前にそれを追加します

Cookie または別の ajax リクエストで値を渡すことができます。クッキーは私に最適です

于 2013-06-07T21:03:15.107 に答える