如何检查请求是不是通过 CodeIgniter 中的 AJAX 发出?

Posted

技术标签:

【中文标题】如何检查请求是不是通过 CodeIgniter 中的 AJAX 发出?【英文标题】:How do I check if the request is made via AJAX in CodeIgniter?如何检查请求是否通过 CodeIgniter 中的 AJAX 发出? 【发布时间】:2011-05-17 02:44:33 【问题描述】:

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

CodeIgniter

//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 请求的页面。

【问题讨论】:

【参考方案1】:

如果您使用的是发送 X-Requested-With 标头的库,那么您可以这样做...

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

【讨论】:

@prodigitalson 只是风格,我经常使用 Kohana 框架,encourages it(另外我认为它读起来也更好)。 请停止使用 AND/OR 代替 &&/||,它们不一样!查看这个问题了解更多详情***.com/q/2803321/77850 Kohana 框架违反 PSR 标准(他们使用蛇形大小写、Allman 风格等...),请在其他地方应用他们的任何约定! @alex 你知道它们不一样,我知道它们不一样,但是如果其他人找到你的代码并且不知道区别,就会认为它是一样。请不要再这样做了,尤其是如果您知道这是错误的。 @misterjinx 本身并没有,只是风格不同,有一些优先级差异。如果有人对两个不同的运营商做出假设,我应该受到责备吗?无论如何,我删除了它并使用了建议的编辑。【参考方案2】:

从 Codeigniter 2.0 开始,首选使用 $this-&gt;input-&gt;is_ajax_request()

【讨论】:

Ick I hate 方法名称中的下划线。但是 +1 在您对 OP 的回答中坚持使用 CodeIgniter。 由于问题与 CodeIgniter 相关,因此这是最佳答案!仍在使用 CodeIgniter 3.0!【参考方案3】:

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

如果您仍在寻找完美的解决方案(HTTP_X_REQUESTED_WITH 并不总是可靠,因为您的库可能不支持此功能。如果用户落后,它甚至可能被代理剥离)尝试使用 crumbs 来保护您的ajax api。 Crumbs 用于流验证,确保用户通过预定义/预先确定的流而不是直接访问 api。

【讨论】:

如果 javascript 被关闭或恰好被另一个脚本破坏,还有一个优雅的回退到 ajax 的想法。这些请求可能需要返回 html 而不是 ajax 请求所期望的。【参考方案4】:

在 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.

【讨论】:

【参考方案5】:

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

【讨论】:

【参考方案6】:

在 Yii 中你只需检查一下

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

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

【讨论】:

【参考方案7】:

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-&gt;input-&gt;get_request_header(); $this-&gt;input-&gt;is_cli_request() $this-&gt;input-&gt;ip_address()

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

【讨论】:

以上是关于如何检查请求是不是通过 CodeIgniter 中的 AJAX 发出?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 CodeIgniter 中检查多个值是不是唯一

CodeIgniter - 检查数据库中是不是已存在值

Codeigniter-检查用户是不是存在于月份

在 CodeIgniter 中检查 Ajax 请求

在 Codeigniter 中如何通过 ngrok 执行 POST 请求?

如何创建ajax请求以使用DataTable和Codeigniter并在同一文件中返回