首页 > 解决方案 > 已被 CORS 策略阻止:预检响应中的 Access-Control-Allow-Headers 不允许请求标头字段 x-xhr-logon

问题描述

我正在尝试在 sap ui5 中使用外部宁静的 Web 服务。当我在 fiori 启动板中使用相同的内容时,它会在 cosole 中引发以下错误,并且磁贴应用程序中没有数据。我怎么能克服呢?我检查了许多与此相关的博客,但没有得到任何帮助。

错误:从源“url2”访问“ https://api.myjson.com/bins/ijyy2 ”处的 XMLHttpRequest 已被 CORS 策略阻止:Access-Control-Allow 不允许请求标头字段 x-xhr-logon - 预检响应中的标头。

注意:url2= https://sapmobile.mycompanyname.com只不过是我们的 fiori 启动板 url。

标签: sapui5sap-fiori

解决方案


这是一个已知的 Fiori Launchpad 问题。有一个文件abap.js覆盖sendXMLHttpRequest.

如果您将外部 API 添加为 SAP Cloud Platform 中的新目标(或在本地环境中使用 Web Dispatcher),则不会再有 CORS 调用,因此不会再出现 CORS 问题。

如果您想要一个纯 JavaScript 解决方案,您可以使用两个函数恢复原始实现。将这些添加到您的控制器中。

在访问您的外部 API 之前立即调用以下命令

_overrideRequestPrototype: function () {
    if (!XMLHttpRequest._SAP_ENHANCED) {
        return;
    }
    this.__send = XMLHttpRequest.prototype.send;
    XMLHttpRequest.prototype.send = function (oBody) {
        let oChannel = {};
        this._checkEventSubscriptions();
        try {
            oChannel = this._channel;
            this._saveParams(oBody);
            this._send(oBody);
            if (oChannel) {
                oChannel.sent();
            }
        } catch (oError) {
            if (oChannel) {
                oChannel["catch"](oError);
            } else {
                throw oError;
            }
        }
    };
}

调用后,使用以下函数恢复 SAP 代码:

_restoreRequestPrototype: function () {
    if (!XMLHttpRequest._SAP_ENHANCED) {
        return;
    }
    XMLHttpRequest.prototype.send = this.__send;
}

推荐阅读