如何检查请求是不是通过 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->input->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->input->get_request_header();
$this->input->is_cli_request()
$this->input->ip_address()
您可以在Official documentation查看可用方法的完整列表
【讨论】:
以上是关于如何检查请求是不是通过 CodeIgniter 中的 AJAX 发出?的主要内容,如果未能解决你的问题,请参考以下文章