在ajax请求上使用is_ajax_request函数时,codeigniter失败

时间:2018-04-06 08:58:54

标签: javascript php jquery ajax codeigniter

我尝试使用ajax请求从面板管理员更新用户密码是在控制器上使用 is_ajax_request(),但此功能表示我不在ajax请求中。为什么会这样?

这是我的ajax jquery:

$.ajax({
    url: urlTarget,
    traditional: true,
    type: 'post',
    dataType: 'json',
    data: {currentPassword:currentPassword, newPassword:newPassword},
    success: function ( result ) {
        if( result.status == 'success' ){
            window.location = baseUrl;
        }else{
            $("#login-invalid-input").show();
            $("#login-submit").attr("disabled", false);
        }
    },
    error: ajax_error_handling
});

在控制器上:

    private function ajax_checking(){
        if ( !$this->input->is_ajax_request() ) {
            redirect( base_url() );
        }
    }

    public function change_password(){
        $this->ajax_checking();
        $this->load->model("admin_model");

        $postData = $this->input->post();
        $id = $this->session->userdata('id_admin');

        if($this->admin_model->check_current_password($id, $postData['currentPassword'])){
            $this->admin_model->change_password($id, $postData['newPassword']);
            $send["status"] == "success";
        }else
            $send["status"] == "fail";

        echo json_encode($send);
    }

由于ajax_checking的结果为false,系统会将我重定向到设置的网址。有人可以帮帮我吗?

3 个答案:

答案 0 :(得分:0)

is_ajax_request(),此函数检查是否已设置HTTP_X_REQUESTED_WITH服务器头,如果set response为true,否则为false表示它将返回布尔响应。

在constants.php文件中,您可以添加:

define('IS_AJAX', isset($_SERVER['HTTP_X_REQUESTED_WITH']) && strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) == 'xmlhttprequest'); 

然后在您的代码中而不是

private function ajax_checking(){
    if ( !$this->input->is_ajax_request() ) {
        redirect( base_url() );
    }
}

使用

private function ajax_checking(){
    if ( !IS_AJAX ) {
        redirect( base_url() );
    }
}

更新

在每个ajax请求中设置标头。

$.ajaxSetup({
    beforeSend: function(xhr) {
        xhr.setRequestHeader('HTTP_X_REQUESTED_WITH', 'xmlhttprequest');
    }
});

答案 1 :(得分:0)

谢谢你的帮助, 这是将我重定向到baseUrl的问题:

我在控制器上设置了这个, 它发生是因为我在控制器上有这个脚本,将我重定向到basicUrl:

    public function __Construct() {
        parent::__Construct();
        if($this->session->userdata('logged_in') ) {
            redirect( base_url() );
        }
    }

答案 2 :(得分:0)

最近我在使用 CodeIgniter 时遇到了类似的问题,$this->input->is_ajax_request() 在安装了 Centos Web 面板 (CWP) 的 CentOS 服务器上无法运行,而在我的本地主机上运行良好。

我的解决方案是在我的 JavaScript 之上添加以下内容:

$.ajaxSetup({
    beforeSend: function(xhr) {
        xhr.setRequestHeader('X-Requested-With', 'XMLHttpRequest');
    }
});

由于实时服务器没有发送 CodeIgniter 需要识别 Ajax 请求的标头 X-Requested-With