sap服务器上的代理servlet web-inf / web.xml,用于调用外部REST

时间:2018-02-27 14:56:28

标签: javascript ajax proxy sapui5

要开发自定义SAPUI5 / Fiori应用程序,我们需要从另一台服务器使用RESTful Web服务。避免CORS(跨域)错误我们在本地使用eclipse,它支持我们使用" UI5简单代理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 Application Server上测试应用程序,则无法使用URL中的proxy-servlet进行以下调用:

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和选项&#34; - disable-web-security&#34; RESTcall工作正常。

有没有办法在SAP Netweaver Application服务器上使用proxy-servlet?

1 个答案:

答案 0 :(得分:2)

它不起作用的原因是因为它不起作用。在the official documentation中,SAP声明:

  

请注意,由于安全原因,SimpleProxyServlet仅限于本地测试目的。它只能用于本地主机方案(访问网关服务以避免跨域问题),并且在部署在应用程序服务器上时不起作用。为了高效使用,请参阅成熟的代理servlet。

当然,你可以忽略这一点,无论如何都要这样做。我不确定他们究竟是如何阻止servlet成为已部署应用程序的一部分,但我相信你可以通过这种或那种方式让它工作:

  • 如果包含它的JAR实际上没有包含在WAR / EAR中,那么您可以尝试在其中强制它(例如,更改maven依赖的范围或更改构建本身)。
  • 最糟糕的演员场景,AS只是将servlet“黑名单”。在这种情况下,您始终可以围绕SAP的servlet构建一个小的“委托”servlet。
  • 如果即使这样也行不通,那么复制粘贴可能就是你的朋友。无论如何,您将无法获得SAP对此servlet的支持,因为文档明确告诉您不要在生产中使用它。

但我不会走这条路。在我看来,除了使用SAP servlet之外,您还有三个主要解决方案:

  • 在您正在使用的REST服务上添加CORS标头。这假设您可以访问它(可能不是这种情况)。如果确实可以这样做,由于性能方面的考虑,这应该是首选解决方案。
  • 在嵌入模式下使用另一个“代理servlet”实现来模拟您在本地使用的设置。你可以看看例如Netflix Zuul
  • 部署一个单独的应用程序,该应用程序唯一担心的是作为AS上所有应用程序的反向代理。好处是您可以更轻松地重用和管理这样的设置(即,相同的Java应用程序将代理多个REST服务并提供多个UI应用程序)。同样,为了达到这个目的,我建议使用像Zuul这样的库。