【问题标题】:Changing User-Agent in XMLHttpRequest from a Chrome extension从 Chrome 扩展更改 XMLHttpRequest 中的用户代理
【发布时间】:2014-02-01 03:59:06
【问题描述】:

我正在尝试从需要更改用户代理的扩展发送 HTTP 请求。

我的代码如下所示:

function getXMLHttpRequest(method, url, extraHeaders) {
    var xhr = new XMLHttpRequest();
    xhr.open(method, url, true)

    for (var headerKey in extraHeaders) {
        xhr.setRequestHeader(headerKey, extraHeaders[headerKey]);
    }

    return xhr;
}
//....

getXMLHttpRequest("POST", "....", { "User-Agent": "Blahblahblah" })

然后,我收到一个错误“拒绝设置不安全的标头:UserAgent”

我需要更改它,因为我的后端需要有一个特殊的用户代理,是否可以通过扩展来做到这一点?

我尝试了 webRequest API,在发送请求之前更改标头,但它说它不适用于扩展生成的 XMLHttpRequest 以防止锁定。

【问题讨论】:

  • @ExpertSystem 但是您可以使用 webRequest API 更改 UserAgent。这是文档中的示例之一。 developer.chrome.com/extensions/webRequest.html
  • @ExpertSystem 我知道它被认为是不安全的,但这不是普通的 javascript,它是一个浏览器扩展,我可以使用套接字并发送我想要的任何内容。为什么不允许发送任意 HTTP 请求?标准也禁止跨域请求,可以通过清单中的适当配置来完成。
  • w3.org/TR/cors 这个描述了您如何无法向不包括 OPTIONS 响应中的 Access-Control-Allow-Origin 的 Web 服务器发出 HTTP 请求。我没有更改我的服务器,我可以将 XMLHttpRequests 设置为响应中不包含该标头的目标。但无论如何,我并不是说 XMLHttpRequest 应该允许它,我要求一种方法来制作一个 HTTP 请求,在 chrome 扩展中指定我自己的 User-Agent。它可以是 chrome.* API 或其他。
  • 我删除了我上面的评论,因为它们没用。我很确定我已经在文档中阅读过它,但显然我错了。 (对不起,造成混乱!)

标签: google-chrome-extension


【解决方案1】:

您可以使用webRequest API 轻松更改 User-Agent 标头。
示例代码见Associate a custom user agent to a specific Google Chrome page/tab

从该答案中获取代码,并将"main_frame", "sub_frame" 更改为"xmlhttprequest" 以修改通过XMLHttpRequest 发起的网络请求。

显然,为了防止死锁,此方法适用于同步请求(即当xhr.open的第三个参数设置为false时)。

【讨论】:

  • 嘿,Rob,一直都是这样吗?我记得在文档中的某处读过关于适用于 chrome.* API 的不安全 XMLHttpRequest 标头的限制,但我再也找不到它了。有什么见解吗?我疯了吗?
  • @ExpertSystem 确实有一个列表,但“用户代理”不是其中的一部分。在developer.chrome.com/extensions/webRequest.html#life_cycle 向下滚动一点以查看隐藏标题的部分列表。不幸的是,该列表“不保证完整或稳定”,因此要获得明确的答案,必须深入挖掘 Chromium 的源代码。
  • 是的,我看到了列表,但记得有一些文档明确表示,与 XHR 相同的“不安全”标头也可以防止。好的,那我可能会失去它。顺便说一句,你总是用你的 Chromium's-source-code-digging 东西吓到我 :)
  • @RobW 您链接到的代码的范围是什么(假设 types 更改为 xmlhttprequest)?它会影响浏览器在扩展内外发起的所有 XMLHttpRequest 吗?我明白了也会被指定的url过滤,只是好奇作用域而已。
  • @figs 所有 XMLHttpRequests。但是您可以选择按顺序不返回任何内容,和/或使用.removeListener 而不是addListener 取消注册事件(例如:stackoverflow.com/a/23001552
猜你喜欢
  • 1970-01-01
  • 2012-01-28
  • 1970-01-01
  • 2016-04-20
  • 1970-01-01
  • 1970-01-01
  • 2012-11-19
  • 2012-03-14
  • 1970-01-01
相关资源
最近更新 更多