7

我在使用一些基于 Web 的工具时遇到问题,该工具以 AJAX 方式向服务器查询 JSON 数据。它不能正常工作 - 返回的结果通常不是我想要的,我需要等待很多时间让服务器处理请求。

事实是我总是希望返回相同的数据(准确地说是几个人),所以我想到了伪造服务器响应。我试图通过几种方式实现这一目标,但没有成功。

我尝试使用 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 开发者控制台网络面板的屏幕截图,显示请求被静默取消: 控制台截图 控制台截图

4

2 回答 2

3

有几种方法可以做到这一点。

最简单的方法是使用Fiddler 如果你懂俄语,或者你的浏览器有不错的翻译功能,你可以阅读这篇文章——据我所知,在你的情况下你需要第二部分——关于 Autoresponder。或者下面有几个英文手册的链接。

这个截图就是答案在此处输入图像描述

关于 chrome 中的 Access-Control-Allow-Origin - 我的扩展也非常简单(只需添加到响应标题“Access-Control-Allow-Origin:*”)并允许您在开发某些功能时避免此错误。您也可以用 Fiddler 做同样的事情在 chrome 中,您可以使用开发人员密钥“chrome --disable-web-security”运行 Chrome,它也可以删除“Access-Control-Allow-Origin”的错误

于 2013-02-11T18:17:59.127 回答
1

如果我理解正确,可以控制生成 JSON 响应的服务器。如果是这种情况,那么在没有任何 Chrome 扩展的情况下,必须有可能使用正确的 CORS 标头来获取 AJAX (XMLHTTPRequest) 请求和响应。

根据我的经验,失败的跨域 XHR 请求似乎只是在 Chrome 中“静默”失败,但如果您仔细查看控制台,您会看到类似于以下内容的错误消息:

XMLHttpRequest 无法加载http://example.com/yourJSONfile.json。Access-Control-Allow-Origin 不允许来源http://your-app-domain.com:80 。

此消息有时可能会产生误导,因为如果与 CORS 相关的任何内容出错(即使 Access-Control-Allow-Origin 设置正确),它也会显示出来。此外,在网络选项卡上,您将看到 XHR 请求和响应标头。

现在让我们谈谈 CORS 标头。我必须查看您请求的 AJAX 选项或 HTTP 请求标头才能准确说明您需要哪些 CORS 标头,但据我现在所知,“Access-Control-Allow-Origin: *”可能不足以满足您的要求成功:根据您的请求标头(我目前不知道,因此以下只是示例),您可能需要额外的 CORS 标头,例如:

“访问控制允许方法”:“选项、获取、发布”

“Access-Control-Allow-Headers”:“内容类型,接受,来源”

此外,出于调试目的,启用:

“访问控制公开标头”:“访问控制允许来源”

这样您就可以在网络选项卡上看到与 CORS 相关的响应标头。

于 2013-02-19T10:00:30.400 回答