如何在CodeIgniter中检查请求是否通过AJAX进行?

时间:2010-11-29 05:45:35

标签: php ajax codeigniter

如何检查请求是否为AJAX?我正在使用CodeIgniter。我有一个链接,当它点击它时,它将打开弹出对话框窗口,这是通过ajax请求控制器名称login_window()完成的。

//Here is the controller name:
function login_window(){
    // request via ajax
    $this->load->view("login_window");
}

的jQuery

//here is the jquery code:
//I am using a jquery plugin FACEBOX

$('a[rel*=dialog]').facebox();

<a href="http://localhost/codeigniter/login_window" rel="dialog">Login</a>

我想检查它是否是一个AJAX请求,如果没有,我会将它们重定向到主页。所以他们无法访问仅适用于ajax请求的页面。

7 个答案:

答案 0 :(得分:79)

如果您使用的是发送X-Requested-With标题的库,那么您可以执行...

if (strtolower(filter_input(INPUT_SERVER, 'HTTP_X_REQUESTED_WITH')) === 'xmlhttprequest') {
   // I'm AJAX!
}

答案 1 :(得分:17)

从Codeigniter 2.0开始,最好使用$this->input->is_ajax_request()

答案 2 :(得分:3)

我认为您基本上希望保护您的ajax api不被用户直接访问。您希望用户在您自己的代码(javascript等)调用时能够访问ajax api,但如果用户尝试直接命中api,则应拒绝用户访问。

如果你仍然在寻找一个完美的解决方案(HTTP_X_REQUESTED_WITH并不总是可靠的,因为你的库可能不支持这个。即使它可能被代理人剥夺,如果用户落后于其中一个)尝试使用crumbs来保护你的ajax api。 Crumbs用于流程验证,确保用户通过预定义/预先确定的流程访问api,而不是直接访问。

答案 3 :(得分:3)

在Codeigniter中我们可以使用

if(!$this->input->is_ajax_request()){ // check if request comes from an ajax
    redirect(site_url('home'),'refresh'); // if the request is not coming from an ajax redirect to home controller.
}

答案 4 :(得分:1)

您可能想尝试添加/修改路径到您的{{1>,而不是检测您的请求是否是ajax请求(可以是任何HTTP动词 - GET / POST / HEAD)用于专门处理这些场景。

答案 5 :(得分:1)

在Yii中,您只需检查

    if (Yii::app()->request->isAjaxRequest)

如果您使用jQuery或其他主要的JavaScript库,它的工作原理。如果您执行自定义请求,请不要忘记将X-Requested-With HTTP标头设置为XMLHttpRequest

答案 6 :(得分:0)

Codeigniter具有内置功能,可以检查是否使用Ajax调用发出请求。

您可以使用以下方法来验证是否使用Ajax调用了controller/segment

<?php
Class Only_ajax extends CI_controller{

   function validate_user()
  {
     /*
      * Check if URL only_ajax/validate_url is called from ajax
      * if not display not found error to user.
      *
      **/

     if(!$this->input->is_ajax_request()){
       show_404();
     }

  }

}

您还可以通过input类使用许多其他检查。 他们很少是

  • $this->input->get_request_header();
  • $this->input->is_cli_request()
  • $this->input->ip_address()

您可以在Official documentation上查看可用方法的完整列表