【问题标题】:Ajax request with codeigniter 403 (forbidden)带有 codeigniter 403 的 Ajax 请求(禁止)
【发布时间】:2018-08-12 14:36:38
【问题描述】:

我正在尝试使用 Ajax 将值发送到 Codeigniter 中的 Controller 文件,但没有成功。我已经搜索过这个问题,我现在这个问题在这里提出了很多次,但仍然找不到解决方案。希望有人可以帮我。 谢谢!

js文件。

function submitSend()
{
    var message = $('#sms').val();
    if(message == "")
    {
      $("#sms").attr("placeholder", "Type a message please...");
      return false;
    }

    $.ajax(
    {
      url: "<?php echo base_url();?>/mychat/send",
      type: 'POST',
      data:{
              '<?php echo $this->security->get_csrf_token_name(); ?>' : '<?php echo $this->security->get_csrf_hash(); ?>',
              'message': message
             },
      success: function (data)
      {
       window.console.log('Successful');
      },
      error :function(data)
      {
      window.console.log('Failed');
      }
    });
}

控制器函数。它在名为 MyChat 的文件中。

public function send()
  {
     $message = $this->input->post('message');
     echo $message;
  }

【问题讨论】:

  • 你得到的只是403?显示什么错误信息?
  • 您可以通过link查看我的相关答案
  • @Alex 现在没有显示错误,但是当我尝试'echo $message in controller file 什么都没有显示。Message 变量没有传递给控制器​​文件。
  • @lothux1987 我已经看到你的回答了,我的 js 代码现在可以了,但是变量消息没有传递给控制器​​文件。我不知道为什么!
  • 检查 devtools 以查看发布的内容。

标签: javascript php jquery ajax codeigniter


【解决方案1】:

恐怕你不能在JavaScript 文件中使用PHP 标签,因为你已经提到你有一个JS 文件。

您必须在 .php 文件中运行您的 PHP 代码。

也许您可以将submitSend() 函数解耦,并通过提取PHP$('#sms').val() 标记使其更加模块化。这些可以作为参数传递给函数,您可以在其中调用它.php 文件)

【讨论】:

    【解决方案2】:

    很可能是因为 CSRF 令牌尝试禁用 csrf 并检查其是否是由于 csrf 然后将 csrf 配置中的特定功能列入白名单

    【讨论】:

      【解决方案3】:

      js文件中不能使用php标签

      url: "<?php echo base_url();?>/mychat/send", //this line in js file is wrong
      

      你只能在这样的 .php 文件中的 script 标签中使用 php 标签

      <script>
       // ... some code here 
           url: "<?php echo base_url();?>/mychat/send",
       // ... some code here
      </script>
      

      或者在标题html中添加这一行

      <script> 
          var BASE_URL = '<?php echo base_url(); ?>';
      </script>
      

      在js文件中使用

      ....
      url: BASE_URL+"mychat/send",
      ....
      

      【讨论】:

      • 我在视图文件中设置了 js 文件中的函数。现在没有显示任何错误,但在我发送变量消息的控制器文件中没有发送任何内容。我不明白为什么?!
      • 变量消息成功从 html 获取值,但不要将其传递给控制器​​文件
      • 因为url错误不能在js文件中使用,消息post到错误的控制器
      【解决方案4】:

      在包含 JS 文件之前在页脚视图中添加此代码

      <?php $CI =& get_instance(); ?>
      <script> 
          var csrf_name = '<?php echo $CI->security->get_csrf_token_name(); ?>';
          var csrf_hash = '<?php echo $CI->security->get_csrf_hash(); ?>';
      </script>
      

      然后像这样在任何你需要的地方调用这些变量

      data:{
           csrf_name : csrf_hash,
           'message': message
      },
      

      【讨论】:

      • 感谢您的重播。我试过这个方法,但不起作用。只有在视图文件中包含 js 函数时才会删除错误。但仍然不能正常工作。'message'变量未发送到控制器文件。
      • 将此变量也添加到页脚&lt;script&gt; var base_url = "&lt;?php echo base_url();?&gt;"; &lt;/script&gt; 然后在您的AJAX 函数中调用它为url: base_url+"/mychat/send",
      • 还是同样的问题。
      • 检查你的配置文件$config['csrf_protection'] = TRUE; $config['csrf_regenerate'] = TRUE; $config['global_xss_filtering'] = TRUE;
      • 好的,在你的页脚中使用 $CI =&amp; get_instance(); // create codeigniter reference instance. 而不是 $this-&gt;security-&gt; 使用 $CI-&gt;security-&gt;
      【解决方案5】:

      这对我有用。

      /app/Config/Security.php

      /**
           * --------------------------------------------------------------------------
           * CSRF Token Name
           * --------------------------------------------------------------------------
           *
           * Token name for Cross Site Request Forgery protection cookie.
           *
           * @var string
           */
          public $tokenName = 'csrf_token_name';
      

      在我的表单中

      <input type="hidden" name="<?= csrf_token() ?>" value="<?= csrf_hash() ?>" />
      

      在 script.js 中

      var tokenHash=jQuery("input[name=csrf_token_name]").val();
      $.ajax({
        method: "POST",
        url: "/somecontroller",
        data: { name: "John", location: "Boston" },
      beforeSend: function (xhr) 
              {       
              xhr.setRequestHeader('X-CSRF-Token' , tokenHash);       
              },
      })
        .done(function( msg ) {
          console.log( "Data Saved: " + msg );
        });
          
      

      【讨论】:

        猜你喜欢
        • 2014-04-26
        • 1970-01-01
        • 1970-01-01
        • 2016-08-29
        • 2017-03-23
        • 2012-12-24
        • 1970-01-01
        • 2014-10-31
        • 2016-11-24
        相关资源
        最近更新 更多