SAP服务器上的代理Servlet Web-Inf/web.xml调用外部休息



要开发一个自定义的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应用程序提供服务(。同样,为了实现这一目标,我建议使用一些图书馆。

最新更新