通过 webRequest.onBeforeSendHeaders 设置自定义 header 时,电子应用程序内 iframe 中的 Cookie 停止工作
Cookies in an iframe inside an electron app stop working when setting custom header via webRequest.onBeforeSendHeaders
我在加载外部 URL 的电子应用程序 (v6.1.2) 中有一个 iframe。我需要使用自定义 header 加载 URL,因此我使用 webRequest.onBeforeSendHeaders()
来拦截请求并插入 header。一旦我将 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
);
PHP 脚本在目标 URL:
<?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 session ID 保留目标站点设置的相同 cookie 和任何 cookie 都会保留。这就是我如何知道这不是 PHP 方面的问题。我也可以排除 X-MY-CUSTOM-HEADER
本身的干扰,因为即使根本不更改 headers(参见代码注释),问题仍然存在。
我是不是遗漏了什么或者这是 electron 中的错误?有什么解决办法吗?
事实证明这是一个相当愚蠢的错误,但由于很难找到关于此的任何好的文档 API,我倾向于不将其作为一个简单的错字来关闭,正如我认为的那样可能对其他人有帮助。
details
对象有一个headers
属性和一个requestHeaders
属性。我实际上不确定有什么区别,因为似乎有一些重叠。我正确地覆盖了 requestHeaders
,但我这样做是扩展 details.headers
而不是 details.requestHeaders
。所以我所要做的就是改变
let requestHeaders = Object.assign({}, details.headers);
到
let requestHeaders = Object.assign({}, details.requestHeaders);
我在加载外部 URL 的电子应用程序 (v6.1.2) 中有一个 iframe。我需要使用自定义 header 加载 URL,因此我使用 webRequest.onBeforeSendHeaders()
来拦截请求并插入 header。一旦我将 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
);
PHP 脚本在目标 URL:
<?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 session ID 保留目标站点设置的相同 cookie 和任何 cookie 都会保留。这就是我如何知道这不是 PHP 方面的问题。我也可以排除 X-MY-CUSTOM-HEADER
本身的干扰,因为即使根本不更改 headers(参见代码注释),问题仍然存在。
我是不是遗漏了什么或者这是 electron 中的错误?有什么解决办法吗?
事实证明这是一个相当愚蠢的错误,但由于很难找到关于此的任何好的文档 API,我倾向于不将其作为一个简单的错字来关闭,正如我认为的那样可能对其他人有帮助。
details
对象有一个headers
属性和一个requestHeaders
属性。我实际上不确定有什么区别,因为似乎有一些重叠。我正确地覆盖了 requestHeaders
,但我这样做是扩展 details.headers
而不是 details.requestHeaders
。所以我所要做的就是改变
let requestHeaders = Object.assign({}, details.headers);
到
let requestHeaders = Object.assign({}, details.requestHeaders);