使用codeigniter 403的Ajax请求(禁止)

时间:2018-03-05 00:31:58

标签: javascript php jquery ajax codeigniter

我正在尝试使用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;
  }

5 个答案:

答案 0 :(得分:1)

在包含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
},

答案 1 :(得分:0)

我担心您无法在PHP个文件中使用JavaScript代码,因为您已经提到过您有JS个文件。

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

也许您可以通过提取submitSend()代码以及PHP来稍微分离$('#sms').val()函数并使其更加模块化。这些可以作为参数传递给函数,您可以将其称为.php个文件)

答案 2 :(得分:0)

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

答案 3 :(得分:0)

你不能在js文件中使用php标签

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

你只能在.php文件的脚本标签中使用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",
....

答案 4 :(得分:0)

这对我有用。

/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 );
  });