【问题标题】:how to disable same origin policy in Javascript (Chrome)如何在 Javascript (Chrome) 中禁用同源策略
【发布时间】:2017-09-16 15:39:14
【问题描述】:

我正在设计一个从不同服务器获取数据的 SAP UI5 应用程序。 目前,我在进行 OData 调用时遇到了跨源错误,解决方法是在 Chrome 中设置 --disable-web-security。但我想要适当的解决方案(一段代码)来避免这个错误。

请注意,我无法在 OData 服务器上进行任何更改。

【问题讨论】:

  • 无法在 javascript 中禁用同源策略。您必须设置正确的响应标头。更多解释见stackoverflow.com/questions/10636611/…
  • 你不能 - 这是一件非常好的事情。你在这里问错了问题。您应该问如何避免它,答案是要么在响应中返回 CORS 标头,要么返回 JSONP。如果你不能做这些,那么你将不得不在服务器端而不是客户端 JS 上发出请求
  • 不——相反。 CORS 标头需要在 response 而不是 request
  • CORS 必须由远程方启用 - 在这种情况下,远程方将是您的“OData 服务器”。没有配置访问权限 - 没有 CORS。
  • 不确定我的评论是否只是被忽略或没有阅读..

标签: javascript cors sapui5


【解决方案1】:

您必须使用代理 servlet 来解决您的 CORS 问题。 在文件 manifest.json 的配置 json 中,添加指向您的 odata 服务或数据提供者的链接,例如:

"config": {
  "oDataRemote": "http://exampleService.com/sap/opu/odata/sap/<ServiceName>",
  "oDataProxyRemote": "proxy/sap/opu/odata/sap/<ServiceName>",
}

在您的 Components.js 中获取 URL 链接并启动您的 oData 模型:

var oConfig = this.getMetadata().getConfig(); //get variables of config json defined in manifest.json
    
    // Define if proxy is required or not
    if (window.location.hostname == "localhost") {
          sServiceUrl = oConfig.oDataProxyRemote;
      } else {
          sServiceUrl = oConfig.oDataRemote;
      } 

确定 uri 后,在您的 components.js 中启动 odata 模型:

var oODataModel = new sap.ui.model.odata.ODataModel(sServiceUrl, mParameters);
this.setModel(oODataModel, "oDataModel");

在 WEB-INF 文件夹中,您需要将以下 servlet 添加到您的 web.xml:

<!-- ============================================================== -->
<!-- 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>
<context-param>
    <param-name>com.sap.ui5.proxy.REMOTE_LOCATION</param-name>
    <param-value>{protocol}://{host name}:{port number}</param-value>
</context-param> 

简单的代理 servlet 仅用于测试目的。如果您的生产环境需要它,您需要一个成熟的代理 servlet。我建议使用反向代理(例如 Apache HTTP Server),将所有 Web 和应用程序服务器集中在一个域中。

您也可以查看 SAP simple proxy servlet提供的示例

【讨论】:

    【解决方案2】:

    您应该在服务器端设置反向代理。你应该通过这个调用外部 url。所有的电话都应该通过这个。

    【讨论】:

      猜你喜欢
      • 2015-12-27
      • 2012-08-29
      • 2014-03-28
      • 2011-08-28
      • 1970-01-01
      • 2014-02-05
      相关资源
      最近更新 更多