【问题标题】:joomla token is not getting recognized by controllers methodjoomla 令牌没有被控制器方法识别
【发布时间】:2013-04-12 02:58:00
【问题描述】:

我正在尝试在 ajax 帖子上设置令牌,但控制器方法无法识别。 javascrip 如下所示

jQuery(document).ready(function() {
    jQuery('#source').change(function() {
        jQuery('#fileupload').addClass('fileupload-processing');
        var data = jQuery('#source option:selected').val();
        jQuery.post('index.php', {
            'option': 'com_tieraerzte',
            'task': 'parser.importColumns',
            'tmpl': 'component',
            'token':'<?php echo JUtility::getToken()?>',
            'app': data,
            'dataType': 'html',
        }, function(result) {
            jQuery('td.add_column').html(result);
            jQuery('button#parse.btn').show();
            //edit the result here
            return;
        });
    });

令牌正在生成和发布

在控制器中,我检查了令牌的存在,但抛出了无效令牌

控制器检查令牌

 JRequest::checkToken('request') or jexit( 'Invalid Token' );

【问题讨论】:

    标签: ajax joomla token


    【解决方案1】:

    你快到了,只是有点混乱。 Joomla!生成并提交表单令牌作为输入名称,值为 1。因此,令牌在您的表单中如下所示:

    &lt;input type="hidden" name="1LKJFO39UKSDJF1LO8UFANL34R" value="1" /&gt;

    考虑到这一点,当通过 AJAX 提交时,您需要将参数名称设置为您的令牌名称,值为 1。我通过使用 jQuery('selector').serialize() 方法完成类似的操作:

    Joomla.autoSave = function () {
      jQuery.ajax({
        url: "index.php?option=com_gazebos&task=product.apply&tmpl=component",
        type: "POST",
        data: jQuery("#product-form").serialize(),
        success: function (data) {
          console.log("autosaved");
        }
      });
    };
    

    这样做会拉入所有表单数据(包括来自隐藏输入的表单标记)并将其格式化为查询字符串,然后将其与请求一起发送。但是,在我看来,您可能不想这样做,而且您实际上只想提交一点数据,而不是整个表单。所以,让我们稍微修改一下代码以获得预期的效果:

    /**
     * First, let's alias $ to jQuery inside this block,
     * then setup a var to hold our select list dom object.
     */
    jQuery(document).ready(function ($) {
        var sourceSelect = $('#source');
    
        sourceSelect.change(function () {
            $('#fileupload').addClass('fileupload-processing');
    
            /**
             * Use the token as a parameter name and 1 as the value,
             * and move the dataType param to after the success method.
             */
            $.post('index.php',
              {
                'option':   'com_tieraerzte',
                'task':     'parser.importColumns',
                'tmpl':     'component',
                'app':      sourceSelect.val(),
                '<?php echo JSession::getFormToken()?>': 1
              },
              function(result) {
                $('td.add_column').html(result);
                $('button#parse.btn').show();
                //edit the result here
                return;
              },
              'html'
            );
        });
    });
    

    最后,此代码假设您在 view.html.phpviews/parser/tmpl/default.php 中有此 js 代码。如果您将它放在单独的 .js 文件中,那么您的 php 代码将不会执行并为您提供令牌。

    【讨论】:

    • 一如既往的棒!谢谢。
    【解决方案2】:

    在您的 ajax 调用方法中,使用 url 作为:

    $.ajax({
                  url: '/index.php?option=com_itemreview&task=item.userReviewVote&<?php echo JSession::getFormToken(); ?>=1',
                  type: 'post',
                  data: {'data': submitvalue},
                  dataType: 'json',
                  success: function(response) {
                  }
    });
    

    更多信息请看这里:

    http://joomlabuzz.com/blog/27-preventing-cross-site-request-forgery-in-joomla

    https://docs.joomla.org/How_to_add_CSRF_anti-spoofing_to_forms

    【讨论】:

      猜你喜欢
      • 2013-04-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-11-11
      • 2018-09-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多