通过 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 服务——绕过跨域策略的主要内容,如果未能解决你的问题,请参考以下文章
JSF 1.1-不刷新页面调用backing bean的动作方法(通过ajax/javascript)