要开发一个自定义的sapui5/fiori应用程序,我们需要从另一台服务器中消费一个安息的网络服务。避免CORS(交叉原始(错误我们本地使用Eclipse,以" UI5 Simple Proxy Servlet"支持我们。
<!-- ============================================================== -->
<!-- UI5 proxy servlet -->
<!-- ============================================================== -->
<servlet>
<servlet-name>SimpleProxyServlet</servlet-name>
<servlet-class>com.sap.ui5.proxy.SimpleProxyServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>SimpleProxyServlet</servlet-name>
<url-pattern>/proxy/*</url-pattern>
</servlet-mapping>
如果我在SAP应用程序服务器上测试了该应用程序,则使用URL中的代理服务与以下调用无法使用:
var serviceUrl = 'proxy/<host>/<service>/rest/api/content/' + contentID + '?parameters';
$.ajax({
type: 'GET',
url : serviceUrl,
headers: {
'Authorization': "Basic " + btoa('USERNAME' + ":" + 'PWD') },
dataType: 'json',
indexValue: { param1:oView,
param2:oModel
},
crossDomain: true,
success: function(data,textStatus,ErrorHandler) {
alert("Success");
},
error: function(ErrorHandler,textStatus,errorThrown) {
alert("Error");
}
在没有代理/的情况下运行它,带有chrome和选项" -disable-web-security" RESTCALL工作正常。
有没有一种方法可以在SAP NetWeaver应用程序服务器上使用代理服务?
它不起作用的原因是因为它并不是要工作。SAP指出,在其正式文档中:
请注意,由于安全原因,简单的Proxyservlet仅限于本地测试目的。它只能用于本地主机方案(访问网关服务以避免跨域问题(,并且在应用程序服务器上部署时无效。供生产性使用,请参阅成熟的代理servlet。
当然,您可以忽略这一点,无论如何都可以做到。我不确定他们如何确切地阻止servlet成为您已部署的应用程序的一部分,但是我相信您可以以一种或另一种方式使其工作:
- 如果包含它的罐子实际上未包含在战争/耳朵中,那么您可以尝试将其强加在那里(例如,更改Maven依赖的范围或更改构建本身(。
- 最糟糕的铸造场景,简单地"黑名单" servlet。在这种情况下,您总是可以在SAP的Servlet周围建立一个小的"代表" servlet。
- 如果即使是不起作用,那么复制可能是您的朋友。无论如何,您将不会从SAP获得此servlet的支持,因为文档专门告诉您不要在生产中使用它。
,但我不会走这条路。我认为,除了使用SAP Servlet外,您还有三个主要解决方案:
- 在您要消费的休息服务中添加CORS标头。假设您可以访问它(可能不是这种情况(。如果确实可以做到这一点,则由于性能考虑,这应该是首选的解决方案。
- 在嵌入式模式下使用另一个"代理servlet"实现,以模仿您在本地使用的设置。您可以看一下Netflix Zuul。
- 部署一个单独的应用程序,该应用程序的唯一关注点是对AS上所有应用程序的反向代理。好处是,您可以更轻松地重复使用和管理这样的设置(即,同一Java应用程序将代理多个REST服务并为多个UI应用程序提供服务(。同样,为了实现这一目标,我建议使用一些图书馆。