我想拦截应用程序中所有部分和库的抓取,同时我也不想破坏通过文件URL使用该应用程序的可能性-这对电子和移动设备非常有用(通过WebView)。现在,我已经找到了两种可能的方法:
类似here
const realFetch = window.fetch;
window.fetch = function() {
// do something
return realFetch.apply(this, arguments)
}
类似here,且已注册服务工作者:
main.js:
if ('serviceWorker' in navigator) {
window.addEventListener('load', function() {
navigator.serviceWorker.register('sw.js').then(function(registration) {
console.log('Service worker registered with scope: ', registration.scope);
}, function(err) {
console.log('ServiceWorker registration failed: ', err);
});
});
}
sw.js:
self.addEventListener('fetch', function(event) {
event.respondWith(
// intercept requests by handling event.request here
);
});
使用第一种方法,我无法拦截来自网络工作者的获取请求。第二种方法不适用于文件URL,我希望我的应用程序通过文件URL工作,因为它允许我通过桌面电子版或Android的WebView使用该应用程序。还有其他方法可以拦截获取请求吗?
P.S。我无法修改尝试拦截其请求的工作程序。
更新: 在@Ciro Corvino的回答的基础上,我尝试了第三种方法:在其他任何方法之前先启动自己的工作程序,然后尝试从那里重新定义访存。不幸的是,这对我没用,这是代码:
function redefineFetch() {
console.log('inside worker');
if (self.fetch == null) {
console.log('null!');
} else {
console.log(self.fetch.toString());
}
const originalFetch: WindowOrWorkerGlobalScope['fetch'] = self.fetch;
self.fetch = (input: RequestInfo, init: RequestInit) => {
console.log('overridden');
return originalFetch(input, init);
}
}
const blob = new Blob(['(' +
redefineFetch.toString() + ')()'], {type: 'text/javascript'});
const blobUrl = window.URL.createObjectURL(blob);
const w = new Worker(blobUrl);
我确定这段代码会在其他工作线程之前启动(我已经添加了超时),但这不会为其他工作线程重新定义获取。有人可以解释原因或解决方案吗?
更新2: 显然,每个工作人员都有自己的私有WorkerGlobalScope,否则使用消息进行工作人员之间的通信是没有意义的。如果可能的话,可能是针对我的问题的另一种解决方法是重写Worker构造函数。将检查它。
答案 0 :(得分:2)
只需尝试将当前WorkerGlobalScope
的访存方法覆盖到主要javascript上下文(window
)中,并覆盖在调用此函数的专用辅助上下文中运行的每个js文件:
请注意,
self
属性返回每个上下文的专用范围
//works in each worker context you call it and enable fetch interception
function EnableFetchWithArguments() {
const originalCtxFetch = self.fetch;
self.fetch = function() {
// Get the parameter in arguments
// Intercept the parameter here
return originalCtxFetch.apply(this, arguments)
}
}
请参阅参考资料和浏览器兼容性:WorkerGlobalScope