webRequest.onHeadersReceived
当接收到请求的 HTTP 响应标头时触发。使用此事件修改 HTTP 响应标头。
要将响应标头与请求数据的其余部分一起传递到侦听器,请在 extraInfoSpec
数组中传递 "responseHeaders"
。
如果您使用 "blocking"
,则必须在您的 manifest.json 中拥有 "webRequestBlocking" API 权限。
扩展程序可能会发出冲突的请求。如果两个扩展程序监听同一个请求的 onHeadersReceived
并返回 responseHeaders
以设置原始响应中不存在的相同标头(例如,Set-Cookie
),则只有一个更改会成功。
但是,Content-Security-Policy
标头的处理方式不同;它的值会合并以应用所有指定的策略。但是,如果两个扩展程序设置了冲突的 CSP 值,则 CSP 服务会使限制更加严格以解决冲突。例如,如果一个扩展程序设置了 img-src: example.com
,而另一个扩展程序设置了 img-src: example.org
,则结果为 img-src: 'none'
。合并的修改总是倾向于更加严格,尽管扩展程序可以删除原始的 CSP 标头。
如果您想查看系统处理的标头,而不会有其他扩展程序更改它们的风险,请使用 webRequest.onResponseStarted
,尽管您不能在此事件上修改标头。
语法
browser.webRequest.onHeadersReceived.addListener(
listener, // function
filter, // object
extraInfoSpec // optional array of strings
)
browser.webRequest.onHeadersReceived.removeListener(listener)
browser.webRequest.onHeadersReceived.hasListener(listener)
事件有三个函数
addListener(listener, filter, extraInfoSpec)
-
向此事件添加侦听器。
removeListener(listener)
-
停止监听此事件。
listener
参数是要删除的侦听器。 hasListener(listener)
-
检查
listener
是否为该事件注册。如果正在监听,则返回true
,否则返回false
。
addListener 语法
参数
listener
-
当此事件发生时调用的函数。该函数将传递以下参数
返回:
webRequest.BlockingResponse
。如果在extraInfoSpec
参数中指定了"blocking"
,则事件侦听器将返回一个BlockingResponse
对象,并可以设置其responseHeaders
属性。在 Firefox 中,返回值可以是解析为BlockingResponse
的Promise
。 filter
-
webRequest.RequestFilter
。一组限制发送到此侦听器的事件的筛选器。 extraInfoSpec
可选-
string
的array
。事件的额外选项。您可以传递以下任何值"blocking"
以使请求同步,以便您可以修改请求和响应标头"responseHeaders"
以将响应标头包含在传递给侦听器的details
对象中
其他对象
details
-
string
。如果请求来自在上下文标识中打开的标签,则为上下文标识的 Cookie 存储 ID。有关更多信息,请参阅 使用上下文标识。 documentUrl
-
string
。将在其中加载资源的文档的 URL。例如,如果网页在 "https://example.com" 中包含图像或 iframe,则图像或 iframe 的documentUrl
将为 "https://example.com"。对于顶级文档,documentUrl
未定义。 frameAncestors
-
array
。有关从请求的文档到顶级文档的框架层次结构中每个文档的信息。数组中的第一个元素包含有关请求文档的直接父级的的信息,最后一个元素包含有关顶级文档的信息。如果加载的是顶级文档,则此数组为空。 frameId
-
integer
。如果请求发生在主框架中,则为零;正值是请求发生的子框架的 ID。如果加载了(子)框架的文档(type
为main_frame
或sub_frame
),则frameId
表示此框架的 ID,而不是外部框架的 ID。框架 ID 在一个标签内是唯一的。 fromCache
-
boolean
。响应是否从磁盘缓存中获取。 incognito
-
boolean
。请求是否来自私密浏览窗口。 ip
-
string
。发送请求的服务器的 IP 地址。它可以是文字 IPv6 地址。 method
-
string
。标准 HTTP 方法:例如,“GET” 或 “POST”。 originUrl
-
string
。触发请求的资源的 URL。例如,如果 "https://example.com" 包含链接,用户点击了链接,则结果请求的originUrl
为 "https://example.com"。originUrl
通常与documentUrl
相同,但并不总是相同。例如,如果页面包含 iframe,并且 iframe 包含加载新文档到 iframe 的链接,则结果请求的documentUrl
为 iframe 的父文档,但originUrl
为包含链接的 iframe 中的文档的 URL。 parentFrameId
-
integer
。包含发送请求的框架的框架的 ID。如果不存在父框架,则设置为 -1。 proxyInfo
-
object
。此属性仅在代理请求时存在。它包含以下属性host
-
string
。代理服务器的主机名。 port
-
整数
。代理服务器的端口号。 类型
-
字符串
。代理服务器的类型。其中之一- "http": HTTP 代理(或 HTTPS 的 SSL CONNECT)
- "https": 通过 TLS 连接到代理的 HTTP 代理
- "socks": SOCKS v5 代理
- "socks4": SOCKS v4 代理
- "direct": 无代理
- "unknown": 未知代理
用户名
-
字符串
。代理服务的用户名。 代理DNS
-
布尔值
。如果代理将根据提供的主机名执行域名解析,则为真,这意味着客户端不应执行自己的 DNS 查找。 故障转移超时
-
整数
。故障转移超时(以秒为单位)。如果代理连接失败,则在此期间不会再次使用该代理。
请求 ID
-
字符串
。请求的 ID。请求 ID 在浏览器会话中是唯一的,因此您可以使用它们将与同一请求关联的不同事件关联起来。 responseHeaders
可选-
webRequest.HttpHeaders
。此请求收到的 HTTP 响应头。 状态码
-
整数
。服务器返回的标准 HTTP 状态码。 状态行
-
字符串
。响应的 HTTP 状态行或 HTTP/0.9 响应(即缺少状态行的响应)的“HTTP/0.9 200 OK”字符串。 标签 ID
-
整数
。发生请求的标签的 ID。如果请求与标签无关,则设置为 -1。 第三方
-
布尔值
。指示请求及其内容窗口层次结构是否为第三方。 时间戳
-
数字
。此事件触发的时刻,以自纪元以来的毫秒数表示。 类型
-
webRequest.ResourceType
。正在请求的资源类型:例如,“image”、“script”、“stylesheet”。 url
-
字符串
。请求的目标。 URL 分类
-
对象
。如果请求被Firefox 跟踪保护分类,则与请求关联的跟踪类型。这是一个具有以下属性的对象分类标志包括
fingerprinting
和fingerprinting_content
:表示请求参与指纹识别(“发现对指纹识别的来源”)。fingerprinting
指示该域属于指纹识别和跟踪类别。此类域的示例包括希望将配置文件与访问用户关联的广告商。fingerprinting_content
指示该域属于指纹识别类别但不属于跟踪类别。此类域的示例包括使用指纹识别技术来识别访问用户以进行反欺诈目的的支付提供商。
cryptomining
和cryptomining_content
:与指纹识别类别相似,但用于加密挖掘资源。tracking
、tracking_ad
、tracking_analytics
、tracking_social
和tracking_content
:表示请求参与跟踪。tracking
是任何通用的跟踪请求,ad
、analytics
、social
和content
后缀标识跟踪程序的类型。any_basic_tracking
:一个元标志,它结合了跟踪和指纹识别标志,不包括tracking_content
和fingerprinting_content
。any_strict_tracking
:一个元标志,它结合了所有跟踪和指纹识别标志。any_social_tracking
:一个元标志,它结合了所有社交跟踪标志。
浏览器兼容性
BCD 表仅在启用 JavaScript 的浏览器中加载。
示例
此代码在从目标 URL 请求资源时设置一个额外的 Cookie
let targetPage =
"https://mdn.org.cn/en-US/Firefox/Developer_Edition";
// Add the new header to the original array,
// and return it.
function setCookie(e) {
const setMyCookie = {
name: "Set-Cookie",
value: "my-cookie1=my-cookie-value1",
};
e.responseHeaders.push(setMyCookie);
return { responseHeaders: e.responseHeaders };
}
// Listen for onHeaderReceived for the target page.
// Set "blocking" and "responseHeaders".
browser.webRequest.onHeadersReceived.addListener(
setCookie,
{ urls: [targetPage] },
["blocking", "responseHeaders"],
);
此代码与上一个示例的作用相同,只是监听器是异步的,返回一个Promise
,该 Promise
通过新的标头解析
const targetPage =
"https://mdn.org.cn/en-US/Firefox/Developer_Edition";
// Return a Promise that sets a timer.
// When the timer fires, resolve the promise with
// modified set of response headers.
function setCookieAsync(e) {
const asyncSetCookie = new Promise((resolve, reject) => {
setTimeout(() => {
const setMyCookie = {
name: "Set-Cookie",
value: "my-cookie1=my-cookie-value1",
};
e.responseHeaders.push(setMyCookie);
resolve({ responseHeaders: e.responseHeaders });
}, 2000);
});
return asyncSetCookie;
}
// Listen for onHeaderReceived for the target page.
// Set "blocking" and "responseHeaders".
browser.webRequest.onHeadersReceived.addListener(
setCookieAsync,
{ urls: [targetPage] },
["blocking", "responseHeaders"],
);
注意:此 API 基于 Chromium 的 chrome.webRequest
API。此文档源自 Chromium 代码中的 web_request.json
。