【问题标题】:Detect an ajax request检测 ajax 请求
【发布时间】:2013-07-23 17:02:03
【问题描述】:

我正在编写自己的 MVC 框架来练习,并且我有一个 Request 类。我想捕获请求的类型并相应地解析数据,无论是 AJAX/JSON 调用还是 HTML/XML 请求。

我正在使用:

$_SERVER['HTTP_ACCEPT']

当在上面使用 var_dump 时,它会返回 application/json

$.ajax({
    type: 'post',
    url: 'index',
    dataType: 'json',
    data: {
       _method: 'put'
    }
});

var_dump($_SERVER['HTTP_ACCEPT']) 返回:

string(46) "application/json, text/javascript, */*; q=0.01"

问题: 这种方法可靠吗?它总是有效吗?像这样检测 ajax 调用是否存在安全问题?

请注意,我的框架中的所有 ajax 调用都必须具有 dataType: 'json' 除非它是不同类型的调用,例如 HTMLXML.

【问题讨论】:

  • 你真的关心它是一个 AJAX 请求还是仅仅关心请求的返回格式是什么?

标签: php jquery ajax json


【解决方案1】:

使用 jQuery,您可以使用$_SERVER['HTTP_X_REQUESTED_WITH'],它将被设置为“XMLHttpRequest”。这是使用 jQuery 时最可靠的方法。

【讨论】:

  • XMLHttpRequest 意味着它是一个ajax调用?如果是 XML 或 JSON,我将如何检测类型?
  • @GGio 根据您的需要,您可以尝试解析 Accept 标头,但我个人会使用查询字符串参数或文件扩展名来指示所需的输出格式。至少对于基本用例而言。
  • 似乎有两个问题:如何检测请求是否来自ajax,以及如何找出数据类型。这个答案回答了第一个问题。至于第二个问题,好吧,可靠被高估了!请参阅this question 了解 JSON 的真正 MIME 类型和this one 了解使用 Apache 而非 PHP 处理类型检测。
  • @nt.bas 这么说吧。一个查询字符串参数将使他在大约 30 秒内备份并工作。类型检测/解析不会:)。如果抽象得当,将来很容易改变。
  • @ColinMorelli 是的,这就是我说类型检测可靠性被高估的原因。 :-) 希望 OP 花时间实际尽力正确验证参数。
【解决方案2】:

Colin Morelli 回答了您的主要问题,但这应该有助于您进行后续跟进。

XMLHttpRequest 意味着它是一个 ajax 调用?如果我将如何检测类型 它的 XML 或 JSON

是的。 XMLHttpRequest 是发出请求的 JavaScript 对象。不过,它现在的名字很糟糕,因为你可以让它发送你想要的任何东西。要回答您的第二个问题,您必须对收到的有效负载进行某种解析尝试。您可以扫描 XML,如果没有找到,就假设它是 JSON 并尝试解析。

【讨论】:

  • 为什么我不能使用 $_SERVER['HTTP_ACCEPT'] 似乎也能检测到 XML,它给出了 application/xml
  • 假设这样的设置正确通常不是一个好主意。您应该始终手动测试传入的数据,以确保它是您所期望的。此外,您可能会遇到有人向您发送无效 XML 的情况,您应该在执行过多代码之前尽早发现。
猜你喜欢
  • 2012-06-02
  • 2013-10-18
  • 2015-08-08
  • 1970-01-01
  • 2012-01-03
  • 2014-05-29
  • 2012-02-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多