电子应用程序内部iframe中的Cookie在通过webRequest.onBeforeSendHeaders设置自定义



我在一个加载外部URL的电子应用程序(v6.1.2(中有一个iframe。我需要用自定义标头加载该URL,因此我使用webRequest.onBeforeSendHeaders()来拦截请求并插入该标头。一旦我将requestHeaders传递给回调参数,iframe中的cookie就会停止工作。

main.js:

import { remote } from 'electron'
// the constant MY_URL used below contains the extarnal URL
const webRequest = remote.getCurrentWindow().webContents.session.webRequest;
webRequest.onBeforeSendHeaders(
{
urls: [`${MY_URL}*`]
},
(details, callback) => {
// I need to clone details.headers, as simply setting
// details.headers['X-MY-CUSTOM-HEADER']
// won't work
let requestHeaders = Object.assign({}, details.headers);
requestHeaders['X-MY-CUSTOM-HEADER'] = '1'
// even if I set requestHeaders to details.headers, the issue persists.
// only removing the requestHeaders property from the object below will make it work again:
callback({ cancel: false, requestHeaders });
},
['blocking', 'requestHeaders']  // doesn't make a difference,
// and I didn't find anything cookie-related for the "extraInfoSpec" argument
);

目标URL处的PHP脚本:

<?php
session_start();
var_dump(session_id());
var_dump($_COOKIE);
exit;
?>

每次刷新应用程序或iframe时,该脚本的(伪(输出如下:

string(26) "(random PHP session ID different on every call here)" array(0) { }

如果我从上面的main.js中的回调参数中删除了requestHeaders属性,那么输出就是所需的:PHP会话ID保持不变,并且目标站点设置的任何cookie都保持不变。这就是为什么我知道这不是PHP方面的问题。我还可以排除X-MY-CUSTOM-HEADER本身的干扰,因为即使根本不更改标头(请参阅代码注释(,问题仍然存在。

是我遗漏了什么,还是这是电子中的一个错误?有办法解决这个问题吗?

这是一个相当愚蠢的错误,但由于很难找到关于这个API的任何好的文档,我倾向于不把它作为一个简单的打字错误来结束,因为我认为它可能对其他人有帮助。

details对象具有headers属性和requestHeaders属性。事实上,我不确定有什么不同,因为似乎有一些重叠。我正确地覆盖了requestHeaders,但我这样做是扩展了details.headers而不是details.requestHeaders。所以我所要做的就是改变

let requestHeaders = Object.assign({}, details.headers);

let requestHeaders = Object.assign({}, details.requestHeaders);

最新更新