通过 Ajax Javascript 调用 SAP SOAP Web 服务——绕过跨域策略

Posted

技术标签:

【中文标题】通过 Ajax Javascript 调用 SAP SOAP Web 服务——绕过跨域策略【英文标题】:Calling SAP SOAP Webservices via Ajax Javascript – Go round the cross-domain-policies 【发布时间】:2015-12-11 20:53:52 【问题描述】:

我正在尝试开发一个 Web 应用程序,它应该使用 Ajax / javascript 向 SAP Webservice 提交一个 SOAP 请求 (POST)。之后,来自 SAP 系统的相应数据应显示在 Web 应用程序上。

但是,我现在面临跨域问题,因为 Web 应用程序和系统位于不同的域中。如果我调整我的 IE(顺便说一句。IE11)安全设置,应用程序将正常运行。

但我想避免这种情况,因为该应用程序不仅会在我的计算机上使用,而且还会被许多其他用户使用。重要的是它支持所有浏览器和移动设备,无需调整安全设置。

使用默认安全级别,该应用程序不再适用于我,并且我收到错误消息“XMLHttpRequest: Access denied”,因为显然需要 CORS 和 CORS 预检。

在寻找解决方案时,我首先偶然发现了 JSONP。但是由于这是标准的 SAP Web 服务,并且数据是通过 WSDL 以 XML 格式(不是 json)传输的,所以我认为这种方法不适用。此外,我使用“POST”方法。在 JSONP 中,仅支持“GET”方法。

我也想避免通过存储在 SAP 系统和 Web 应用程序之间的另一台服务器或代理来解决问题,因为我不了解与 SAP 系统相关的那些主题,也不知道如何实施这个。

就我而言,CORS 似乎是一个不错的选择。 从请求头中我可以推断出以下属性被发送到 SAP 系统的主机:

选项:使用 Web 应用程序的域

Access-Control-Request-Method:值为“POST”-method

Access-Control-Request-Header:带有“content-type,accept”条目

要求:带有“选项”

查看请求头:http://up.picr.de/23122262lo.png

如果我正确理解了 CORS,SAP 系统现在必须适当地响应此请求以允许交叉访问。我尝试过使用“crossdomain.xml”——我在 SAP 系统域的根目录中提供的 flash 或 adobe 中的文件。通过路径“SAP domain/crossdomain.xml”调用,XML文件如下所示:

<?xml version="1.0" ?>
<cross-domain-policy xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <site-control permitted-cross-domain-policies="all"/>
  <allow-access-from domain="*" to-ports="*" secure="false"/>
  <allow-http-request-headers-from domain="*" headers="*" secure="false"/>
</cross-domain-policy>

不幸的是,这显然还不够。从响应头中我可以看到 XML 文件没有被使用。

查看响应头:http://up.picr.de/23122265yp.png

我应该如何将该 CORS 权限附加到 SAP 中的响应标头?此解决方案是否仅适用于 adobe 或 flash?我是否也可以在我的情况下使用它,或者我可以在 Web 服务设置(SOAMANAGER)中绑定适当的权限,例如。在绑定中?

SAP 侧代理的外观如何?这会是一个选择吗?如果是这样,您对实施有什么建议吗?

我将非常感谢有用的提示和答案,特别是因为我目前没有其他想法,如何解决这个跨域问题。

提前感谢您的帮助。

这是我的请求-sn-p:

`//jQuery.support.cors = true;
$(document).ready(function () 
var wsUrl = "http://BCSW-SAP016.xxxxxx.net:8000/sap/bc/srt/rfc/sap/z_agbs_webservice_xxxx/001/service/binding";
var soapRequest ='<soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope" xmlns:urn="urn:sap-com:document:sap:soap:functions:mc-style">'
                    + '<soap:Header/>'
                    + '<soap:Body>'
                        + '<urn:ZAgbsWebserviceComTab>'
                            + '<Aosuser>'+aOSUser+'</Aosuser>'
                            + '<Asystem>'+aSystem+'</Asystem>'
                            + '<EvTabelle>'
                            + '</EvTabelle>'
                        + '</urn:ZAgbsWebserviceComTab>'
                    + '</soap:Body>'
                + '</soap:Envelope>';
  $.ajax(
    type: "POST",
    url: wsUrl,
    contentType: "application/soap+xml", // charset=UTF-8", //
    action: "urn:sap-com:document:sap:soap:functions:mc-style:Z_AGBS_WEBSERVICE_xxxx:ZAgbsWebserviceComTabRequest",
    dataType: "xml",
    data: soapRequest,
    success: processSuccess,
    error: processError
  );
);

【问题讨论】:

查看请求标头:up.picr.de/23122261xp.jpg 和响应标头:up.picr.de/23122264pe.jpg 以了解正在运行的应用程序。 查看错误消息:up.picr.de/23122263ol.jpg 了解标准安全设置。 【参考方案1】:

看看这个blog post

您需要添加一个自定义处理程序来设置“Access-Control-Allow-Origin”标头,然后在 SICF 中分配标头。

【讨论】:

以上是关于通过 Ajax Javascript 调用 SAP SOAP Web 服务——绕过跨域策略的主要内容,如果未能解决你的问题,请参考以下文章

javascript 通过单击调用Ajax

通过ajax调用传递动态javascript参数

sap如何调用webservice

JSF 1.1-不刷新页面调用backing bean的动作方法(通过ajax/javascript)

通过(ajax/javascript)发布到 django 视图打印空查询集

如何在 JavaScript 中使用 JSONP 请求执行 Ajax 调用? [复制]