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

标签 javascript ajax proxy sapui5

要开发自定义 SAPUI5/Fiori 应用程序,我们需要使用来自另一台服务器的 RESTful Web 服务。为了避免 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 中的 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 和选项“--disable-web-security”,RESTcall 工作正常。

有没有办法在 SAP Netweaver 应用程序服务器上使用代理 servlet?

最佳答案

它不起作用的原因是它不应该起作用。在 the official documentation SAP 对此表示:

Be aware that due to security reasons the SimpleProxyServlet is restricted to local testing purposes only. It can only be used for local host scenarios (accessing Gateway services to avoid cross-domain issues) and will not work when deployed on an application server. For productive use, refer to a mature proxy servlet.

当然,您可以忽略这一点并继续执行。我不确定他们到底是如何阻止 servlet 成为您部署的应用程序的一部分,但我确信您可以通过一种或另一种方式让它工作:

  • 如果包含它的 JAR 实际上并未包含在 WAR/EAR 中,那么您可以尝试将其强制包含在其中(例如更改 Maven 依赖项的范围或更改构建本身)。
  • 最糟糕的情况是,AS 只是将 servlet 列入“黑名单”。在这种情况下,您始终可以围绕 SAP 的 servlet 构建一个小型“代理”servlet。
  • 如果这也不起作用,那么复制粘贴可能是你的 friend 。无论如何,您都不会从 SAP 获得对此 servlet 的支持,因为文档明确告诉您不要在生产中使用它。

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

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

关于javascript - sap 服务器上的代理 servlet web-inf/web.xml 以调用外部 REST,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49011622/

相关文章:

Javascript Date 对象奇怪的行为/错误?

javascript - 单击后退按钮时保留动态更改的选择值

docker - 我没有让 Keycloak 在 Traefik 后面的 docker 中工作

c# - 如何通过代理使用 .dtd 而不是使用 system.net.defaultproxy 来验证 xml

javascript - Chrome 找出哪个外部脚本导致 "Script Error."

javascript - 如何在 y 轴上展开路径?

javascript - 我收到错误 : Cannot read property 'push' of null

javascript - 从 AJAX 请求获取数组值

html - AJAX 是否在整个 GET/POST 过程中维护状态?

linux - 通过经过身份验证的代理进行 debootstrap