2

我在加载外部 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) { }

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

我错过了什么还是这是电子中的错误?有没有办法解决?

4

1 回答 1

1

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

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

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

let requestHeaders = Object.assign({}, details.requestHeaders);
于 2019-10-31T20:35:34.330 回答