前言
最近遇到了一个疑似header头引发的bug,需要修改header头来验证,于是写了个插件来实现
一、插件结构
浏览器插件相关的东西我这里就不说了,简单说下结构

background.js: 实现修改header头的逻辑,插件加载即运行
manifest.json: 插件的一些配置项
二、代码
1.插件配置项
manifest.json代码如下:
1 2 3 4 5 6 7 8 9 10 11
| { "name": "editHeader", "description": "edit header", "version": "1.0.0", "manifest_version": 2, "permissions": ["webRequest", "webRequestBlocking", "http://*/*", "https://*/*"], "background": { "scripts": ["./background/background.js"], "persistent": true } }
|
每个参数对应的含义我就不多说了,manifest.json的配置项很多,可以自己百度
其中比较关键的是permissions中的webRequest,这个配置了插件才能有拦截请求的权限
2.功能代码
background.js代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36
| let targetUrl = 'https://gitee.com/' let headerObj = { test: '123456', 'User-Agent': '456' } chrome.runtime.onInstalled.addListener(function () { console.log('插件已被安装') }) function replaceHeader(url, requestHeaders) { if (url === targetUrl) { for (let key in headerObj) { const idx = requestHeaders.findIndex(x => x.name === key) if (idx !== -1) { requestHeaders[idx].value = headerObj[key] } else { requestHeaders.push({ name: key, value: headerObj[key] }) } } } return requestHeaders } function updateListeners() { if (!listener) listener = function (details) { var header_map = { requestHeaders: details.requestHeaders } if (details && details.url && details.requestHeaders && details.requestHeaders.length > 0) { header_map = { requestHeaders: replaceHeader(details.url, details.requestHeaders) } } return header_map } chrome.webRequest.onBeforeSendHeaders.addListener(listener, { urls: ['<all_urls>'] }, ['requestHeaders', 'blocking', 'extraHeaders']) } var listener = null updateListeners()
|
大致逻辑的话就是通过chrome提供的onBeforeSendHeaders钩子来修改header头
项目地址
github: https://github.com/Ceslsius/editHeader
总结
目前每修改一次参数就需要重新加载一次插件,后续的话准备做成可配置