【问题标题】:Ajax's headers not being sent (via electron webview)Ajax 的标头未发送(通过电子 webview)
【发布时间】:2020-11-12 13:34:23
【问题描述】:

我已经尝试了我在这里找到的标题问题的解决方案,例如beforeSend 并检查 ajax 的版本。我基本上有一个electron 应用程序,里面有一个webview,这个webview 与一个ipc 脚​​本通信,这个ipc 脚本将jquery 添加到访问的页面,然后它执行一个ajax要求。我在前端使用Vue

问题是,它没有发送我提出的自定义请求。虽然,它以前是 100% 工作的。我真的不记得是什么原因造成的。

我的电子应用的主要index.js

mainWindow = new BrowserWindow({
height: 850,
useContentSize: true,
width: 1550,
webPreferences: {

  webSecurity: false,
  nodeIntegration: true,
  webviewTag: true
}
})

webview

<webview :id="webview.key" :src="webview.url" :preload="fullpath + `\\serverBrowserIPC.js`" style="height: 100%" pcontextIsolation></webview>

ipc.js 文件

 const {
   ipcRenderer
 } = require('electron');
 const _ = require("lodash")
 const myajaxfile = require("./myajaxfile.js")

 window.onload = function() {
   var script = document.createElement("script");
   script.src = "https://code.jquery.com/jquery-3.5.1.min.js";
   script.onload = script.onreadystatechange = function() {
   };
   document.body.appendChild(script);

   // var script2 = document.createElement("script");
   // script2.src = "https://cdnjs.cloudflare.com/ajax/libs/axios/0.19.2/axios.min.js";
   // script2.onload = script2.onreadystatechange = function() {
   // };
   // document.body.appendChild(script2);
 };

 ipcRenderer.on("get_item", function(event, payload) {
   myajaxfile.sendRequest()
 });

myajaxfile.js ajax 部分(基本模板):

    let stream_ajax = $.ajax({
    method: "GET",
    url: `https://example.com/ajaxCenter?_action=getserver}`,
    headers: {
      "Access-Control-Allow-Origin": "true",
      'accept': '*/*',
      'X-Requested-With': 'XMLHttpRequest',
      'x-csrf-token': csrf_token
    },
    complete(response, status) {
      if (status === "success") {
        
      } else {
        
      }
    }
  });

没有发送任何标头。以前,它运行良好,没有任何问题。非常感谢任何帮助,这个问题正在停止我的整个项目。

我已经上传了一个项目示例,可以在here下载。使用npm install 安装软件包,然后使用npm run watch 运行electron 应用程序。运行后请点击connect按钮,在控制台查看网络标签。

项目中提供的请求只有在标头中发送csrf-token时才有效,否则会导致重定向。以前,它可以正常工作。

【问题讨论】:

  • 你检查过网络请求了吗?浏览器是否发送了标头?也许这只是一个缓存问题?
  • 我做了,浏览器不发送任何标题。甚至没有 accept 或其他任何东西。
  • @Jaeger 实际上正在发送标头,您可以在 CLI 控制台(不是电子 chrome 控制台)上看到,请参见此处的屏幕截图:prntscr.com/trzx0e 也在源代码中zip文件中的代码,没有ipc.js文件,也没有任何&lt;webview&gt;组件。
  • 为了简单起见,我没有包含这些文件。项目本身有很多不需要的文件。我也在控制台中看到了这个,但在电子铬控制台中停止了显示。

标签: javascript jquery ajax electron


【解决方案1】:

由于您要发送自定义标头,这由 CORS 管理,并将分两步进行。最好在另一个 StackOverflow 答案 here 中进行说明。

我看到的最大问题是,您尝试发送服务器 Access-Control-Allow-Origin,而那是响应中应该来自服务器的标头。我会仔细检查您要连接的服务器是否配置了 CORS。您也可以尝试记录错误消息。 $.ajax 返回的 jqxhr 有很多方法可以获取状态文本。它应该有助于缩小呼叫失败的确切位置。

【讨论】:

  • 请求返回301 状态,然后重定向到其他位置。发生这种情况是因为标题设置不正确。参数是正确的,请求通过Postman 进行了测试,效果很好。它只使用代码获得301
  • 您好,我已使用提供的示例更新了 OP。你能检查一下吗?
  • index.js 中有一个小的 js 错误,我不得不在 /src/renderer/ 文件夹中创建一个空的 store.js 以使项目运行。即使这样,我也会遇到错误,无法解决您的问题。
  • 这很奇怪。我会检查项目并将其与包一起上传,我会更新你。谢谢你告诉我!
【解决方案2】:

真的很奇怪,就是通过jquery在ajax调用中发送headers的方式。

你真的确定你的问题吗?如果是,问题可能出在其他地方,而不是在报告的代码中。

一旦这样说,您可以删除两个自定义标头:X-Requested-With 默认情况下由 jquery 发送值 XMLHttpRequestAccess-Control-Allow-Origin,因为协议希望在服务器响应中找到它(而不是在客户端请求中) )。

【讨论】:

  • 我确定问题不在于代码。问题本身可能与 electron 包装器有关,因为我之前发送过请求并且运行良好。我已经删除了服务器端的标头,它没有改变任何东西。
  • 您好,我已使用提供的示例更新了 OP。你能检查一下吗?
【解决方案3】:

您的客户端(电子)没有任何问题,需要在您的服务器端配置CORS(跨域资源共享)Access-Control-Allow-Origin 标头应该由服务器发送,而不是客户端(您的 Ajax 调用。)。您必须在服务器中配置 CORS 以启用跨域请求,否则 Axios、jquery ajax 等客户端将无法工作。询问您的服务器管理员或应用程序开发人员。这是ho它的工作

当服务器响应 Access-Control-Allow-Origin: * 时,表示该资源可以被任何域访问。您还可以通过在调用实际端点之前将 HTTP OPTIONS 方法发送到服务器来采用 Preflight Request 方法。这是MDN 文档供您参考。

【讨论】:

  • 我正在使用webview 发出请求,所以基本上该请求是由实际服务器发出的。该问题与electron 有关,因为代码至少应该正确发送标头。
  • 是的,但是您仍然需要在服务器中配置 CORS,客户端不需要标头。几个月前我遇到了一个问题,在那之前它正在工作。我可以知道您使用的是哪个服务器吗?
  • 我基本上是在向访问过的网页发送请求,因此,我不知道实际的服务器。我正在使用ipc 从同一页面发送请求并表现得像单击了按钮。
  • @Jaeger 你只有一个我已经提到的解决方案,你必须在服务器中配置 CORS。当您进行设置时,服务器将在响应之前发送Access-Control-Allow-Origin 标头,您将能够获取响应。请参阅 MDN 文档以获得更多说明。
  • Apache 服务器使用 .htaccess 文件,ngix 使用服务器中的 ngix.conf 文件,您需要按照stackoverflow.com/questions/10093053/…中的方式进行配置
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-27
  • 1970-01-01
  • 2011-12-19
  • 1970-01-01
  • 2017-06-05
  • 1970-01-01
相关资源
最近更新 更多