【发布时间】:2013-02-11 11:10:06
【问题描述】:
我遇到了一些以 AJAX 方式向服务器查询 JSON 数据的基于 Web 的工具的问题。它无法正常工作 - 返回的结果通常不是我想要的,我需要等待很多时间让服务器处理请求。
事实上,我总是希望返回相同的数据(准确地说是几个人),所以我想到了伪造服务器响应。我尝试了几种方法来实现这一点,但没有成功。
我尝试使用 Chrome 的 WebRequest 功能 - 我准备了一个扩展并将请求重定向到我的 JSON 编码的数据 URL。它有效,但只有当我在 Chrome 的地址字段中手动输入地址时。当 Web 应用程序尝试访问该地址时,重定向静默失败。我立即想到了 Access Origin 限制,并迅速设置了一个发送 Access-Control-Allow-Origin 标头的 Web 服务器。
不幸的是,这也不起作用。当我手动输入地址时,正在查询服务器并返回正确的 JSON,但在应用程序中请求......默默地失败了。看起来 Chrome 完全忽略了可能的 Access-Control-Allow-Origin 标头,因为它甚至没有查询服务器。 Chrome 很可能只分析 URL,因为当我将有问题的请求重定向到应用程序域中的随机 URL 时它起作用了。
我还尝试使用相同的方法伪造应用程序的整个 JavaScript 文件 - 该文件静态链接到文档(例如,它通过标准脚本标签包含)。我失败得很惨——重定向只是默默地失败了,就像我第一次尝试失败一样。
我的问题的一个常见解决方案是使用某种代理来更改服务器输出,但我不能这样做 - 我不想等待几分钟让服务器处理请求。顺便说一句,该应用程序只能通过 HTTPS 访问。
有没有其他方法可以使用我的硬编码 JSON 来提供应用程序?或者我错过了什么?
编辑 插件代码,基于“catblock”示例:
chrome.webRequest.onBeforeRequest.addListener(
function(info) {
console.log("AJAX call intercepted: " + info.url)
return {redirectUrl: 'data:application/json,"test"'};
},
// filters
{
urls: [
"*://address.to.the.js.file.requested"
]
}, ['blocking']);
清单文件,我只将域添加到权限部分:
{
"name": "CatBlock",
"version": "1.0",
"description": "I can't has cheezburger!",
"permissions": ["webRequest", "webRequestBlocking",
"*://some.domain.com/*"],
"background": {
"scripts": ["background.js"]
},
"manifest_version": 2
}
编辑 2: 以下是 Chrome 开发者控制台网络面板的屏幕截图,显示请求被静默取消:
【问题讨论】:
-
“我尝试使用 Chrome 的 WebRequest 功能” - 您是否在过滤器中添加了“xmlhttprequest”?显示您当前据称已损坏的扩展程序。
-
@RobW:我添加了代码,抱歉耽搁了 - 我无法更快地回答您的请求。
-
您的请求因同源策略而失败(在 Chrome 中,
data:被视为不同的源)。您必须访问 http(s) 资源并将 CORS 标头附加到响应中。 -
@RobW:我想出了这个解决方案,正如我在问题中提到的那样 - 它没有用。当应用程序请求 JSON 时,Chrome 甚至没有向我的 HTTP 服务器发出请求。需要明确的是 - 当我手动输入地址时,一切都很好。我认为这与同源策略有关,但 Chrome 内部假定它应该取消请求,甚至不查看返回的标头。
-
当您将
redirectUrl与来自不同来源的资源一起使用时,请求将被取消。您是否添加了CORS 响应标头,正如我在之前的评论中提到的那样? (要进行快速测试,请附加Access-Control-Allow-Origin: *)。
标签: google-chrome google-chrome-extension