关于JavaScript的跨域问题(Cross Domain)的讨论, 网上有太多的资源了。国内的程序猿写了非常多的优秀文章,Jerry这里就不再重复了。

直入主题,最近我正在做一个原型开发:通过SAP云平台和SAP Cloud Connector把On-Premise系统上的ABAP function module STFC_CONNECTION 暴露出来,给微信消费。

这个function module的逻辑很简单,直接把输入参数REQUTEXT的内容不加任何处理,拷贝到输出参数ECHOTEXT。

具体操作步骤参考我的公众号文章:使用Java+SAP云平台+SAP Cloud Connector调用ABAP On-Premise系统里的函数

部署到SAP云平台后,通过如下的API endpoint进行调用:

https://demoi042416trial.hanatrial.ondemand.com/connectivity/api?userinput=

然后在我的微信消息服务器上发起如下的AJAX调用去消费(因为是POC,所以把API endpoint硬编码在第3行):

遇到了意料之中的跨域错误: No ‘Access-Control-Allow-Origin’ header is present on the requested resource.

如何解决?

解法1:Cross-Origin Resource Sharing

如果服务器端的响应能够通过编程或配置去影响,那么可以借助Cross-Origin Resource Sharing,在HTTP响应结构中添加字段Access-Control-Allow-Origin,其内容根据实际业务赋以需要的origin字段即可。这里的origin在Jerry看来就是一个白名单。

解决方案参考我的博客:

Cross domain request in ABAP and Java

https://blogs.sap.com/2017/05/06/cross-domain-request-in-abap-and-java-with-two-workaround/

解法2:JSONP

用JSONP也能解决跨域问题,但这个方法同样需要在服务器端通过编程方式做一些处理。具体使用方式参考我的博客:

Play around with JSONP in nodeJS server and ABAP server

https://blogs.sap.com/2017/06/04/play-around-with-jsonp-in-nodejs-server-and-abap-server/

而我使用SAP云平台加上Cloud Connector将On Premise上的function module暴露到公网,这种方式开发人员无法对HTTP的响应头进行编程或配置。因此JSONP对于我原型开发解决跨域问题也没有帮助。

在SAP云平台的Mobile Service for Development and Operations cockpit里有对应的Cross Domain Access参数配置。不过我的原型开发没有用到SAP云平台Mobile Service这套架构,因此也不适用。

解法3:自开发ProxyServlet

接下来咋办?Jerry以前做CRM Fiori开发时,用的是Eclipse IDE,在本地起一个Tomcat,上面跑的Fiori应用也能通过localhost这个域访问到On-Premise系统域上的OData服务。当时咋不会遇到跨域问题呢?仔细回忆了一下,当时我们的Tomcat服务器上还部署了一个Proxy Servlet。Index.html发送的AJAX请求被ProxyServlet拦截,由ProxyServlet通过Java代码向On-Premise系统发起请求。请求得到响应之后,ProxyServlet再将其发送给Index.html。

这种类型的Servlet其原理在我的这篇博客里有详细介绍:

Explore the com.sap.ui5.resource.ResourceServlet

https://blogs.sap.com/2014/12/04/explore-the-comsapui5resourceresourceservlet/

思路清楚后,写代码实现就很容易了。上图对应的Java Web项目的源代码在我的github上:

https://github.com/i042416/SCPCrossDomainSolution

1. index.html里发送的AJAX请求实际指向的处理者是ProxyServlet:注意下图第三行的请求url路径中的proxy

2. 开发一个ProxyServlet,拦截url路径里包含proxy的那些请求。回到我的原型开发需求,SAP云平台上的API消费如今通过ProxyServlet来实现,为简单起见,我将API endpoint硬编码在ProxyServlet里。

经过测试,能按照期望的方式工作:域localhost的AJAX请求能够成功访问SAP云平台上的API:

写完之后我在Google上搜了一下,发现SAP已经在github上发布了一个标准的Proxy project,用于处理这种JavaScript跨域访问的问题,大家有兴趣可以了解一下:

https://github.com/SAP/cloud-connectivityproxy

更多阅读

  • 使用Java + SAP云平台 + SAP Cloud Connector调用ABAP On-Premise系统里的函数

  • 使用JDBC操作SAP云平台上的HANA数据库

  • 使用Java程序消费SAP Leonardo的机器学习API

  • C4C和微信集成系列教程

要获取更多Jerry的原创技术文章,请关注公众号”汪子熙”或者扫描下面二维码:

用JavaScript访问SAP云平台上的服务遇到跨域问题该怎么办相关推荐

  1. 如何在SAP云平台上使用MongoDB服务

    首先按照我这篇文章在SAP云平台上给您的账号分配MongboDB服务:如何在SAP云平台的Cloud Foundry环境下添加新的Service 然后从这个链接下载SAP提供的例子程序. 1. 使用命 ...

  2. 如何在SAP云平台上使用MongoDB服务 1

    首先按照我这篇文章在SAP云平台上给您的账号分配MongboDB服务:如何在SAP云平台的Cloud Foundry环境下添加新的Service 然后从这个链接下载SAP提供的例子程序. 1. 使用命 ...

  3. SAP云平台上两个ABAP系统实例之间的互连

    场景:SAP云平台上的两个ABAP系统实例,一个作为数据的提供者-provision system:另一个作为数据的消费者 - client system,后者从前者读取数据,并显示 实现步骤概述: ...

  4. 如何在SAP云平台上创建Redis实例

    SAP云平台上提供了Redis服务: 在Service Marketplace里根据redis作为关键字进行查找: 有三种不同计算能力的Redis服务,满足不同程度的需求. 新建一个服务实例: 类型就 ...

  5. 在SAP云平台上部署和运行Docker应用

    容器技术,Docker,虚拟化,这些名词诞生尽管有很长一段时间了,但是在云原生开发领域仍旧热度不减.甚至连SAP赖以成名的ABAP Netweaver,如今也踏上了容器化的上云探索之路,比如下面这张来 ...

  6. SAP云平台上部署应用时遇到disk quota不够的问题

    我部署了一个应用到SAP云平台后,在控制台上看到这个应用的状态为CRASHED. 在Events区域看到这些日志: tar: Jdeps/bin/yarnpkg.cmd: Cannot creatsy ...

  7. Hyperledger Fabric on SAP Cloud Platform(SAP云平台上的超级账本简介)

    今天的文章来自Wen Aviva, 坐Jerry面对面的程序媛. Jerry在之前的公众号文章<在SAP UI中使用纯JavaScript显示产品主数据的3D模型视图>已经介绍过Aviva ...

  8. 使用cf curl查看SAP云平台上的应用各项明细

    我有一个应用部署在SAP云平台上,完整url为: https://account.hana.ondemand.com/cockpit/#/globalaccount/8c7b2676-8dd1-4a9 ...

  9. 使用Visual Studio Code调试运行在SAP云平台上处于运行状态的nodejs应用

    https://blogs.sap.com/2020/11/23/debugging-nodejs-application-in-vscode-running-on-sap-cloud-foundry ...

最新文章

  1. linux下shell显示-bash-4.1#不显示路径解决方法
  2. 确定浏览器是否支持某些DOM模块
  3. Paxos Made Simple(译)
  4. hana::detail::variadic::take用法的测试程序
  5. XenApp6 建立请求的连接时出错解决方法
  6. 新的一年,推荐一些好书给大家
  7. c++ 自定义 比较器 priority_queue_吃透Java集合系列七:PriorityQueue
  8. 基于C语言图书馆管理系统编程设计
  9. sqlyog 64位linux版本,linux安装mysql+sqlyog可视化(示例代码)
  10. JDK1.8下载 百度网盘
  11. 构筑城市生命线:应急管理需要新思路,全域能力成关键
  12. Illustrator CS4 序列号
  13. 通用样式 -表格的每行的复选框选中打印
  14. 小米路由器3G建站折腾笔记1 - 引言与路由器选择
  15. 远端服务器无响应 请联系网络供应商腾达,移动宽带连接腾达路由器显示 远端服务器无响应。请联系您的网络运营...
  16. 实验三:CART分类决策树python实现(两个测试集)(一)|机器学习
  17. 解决MapGIS 导出shape文件后属性表内容错乱问题
  18. 零基础转行新媒体运营,有哪些必须要掌握的技能
  19. 【Lecroy示波器使用】
  20. [Power Query] 汇总表

热门文章

  1. R语言观察日志(part16)--Google‘s R Style Guide
  2. hive入门之安装模式
  3. 关于 SAP Spartacus OAuth 2.0 Resource Owner Password Flow 实现的一些讨论
  4. SAP Spartacus cost center Add按钮的href属性生成逻辑分析
  5. SAP Spartacus User form通过label标签的实现原理
  6. SAP Cloud for Customer OData v1和v2的区别
  7. SAP Fiori Elements的change and save实现原理
  8. Hybris service layer和SAP CRM WebClient UI架构的横向比较
  9. SAP SRM ABAP Webdynpro和CFCA usb key集成的一个原型开发
  10. SAP UI5 xml view content parse