通过不同的 URL 将一些 WL.Client 适配器调用流量重新路由/转移到 WL 服务器(用于 PCI 支付和安全要求)?

Posted

技术标签:

【中文标题】通过不同的 URL 将一些 WL.Client 适配器调用流量重新路由/转移到 WL 服务器(用于 PCI 支付和安全要求)?【英文标题】:Re-route/Divert some WL.Client Adapter Invocation traffic to WL Server through different URL (for PCI payment and security requirements)? 【发布时间】:2013-08-15 18:01:40 【问题描述】:

工作灯 5.0.6.1

我们的客户要求我们使用英特尔 (http://info.intel.com/rs/intel/images/Intel_Expressway_Tokenization_Broker.pdf) 的 PCI 设备来避免应用程序和服务器的 PCI 审核。

因此,与支付数据有关的适配器调用将需要通过此硬件设备,然后才能访问 Worklight 服务器。所有其他适配器调用应直接转到 Worklight 服务器(以免设备过载)。 想法是在后台拥有两个不同的 URL,但使用相同的 worklight 服务器。假设通过设备的调用对于 Worklight 服务器是透明的,因此 Worklight 功能不应该受到影响。

我的问题是:

为同一个 Worklight 服务器提供两个不同的 URL 并从客户端交替这些 URL 以进行适配器调用的 Worklight 最佳实践(仅限;不是直接更新或其他任何内容,因为我们假设这是本机执行的)?

是否可以通过客户端代码中的 javascript 代码动态覆盖用于适配器调用的 Worklight 服务器 URL?例如覆盖在 WL.Client AJAX 适配器调用之前从某处获取/返回工作灯 URL 的特定 JS 函数?

我们还在研究让负载平衡器根据正在调用的 AdapterName 的正则表达式切换路由。但目前还不确定这是否可能以及对性能的影响是什么。

【问题讨论】:

Christian,我相信你已经问过好几次关于在运行时更改适配器的连接细节的问题了?从那以后,答案没有改变。将适配器部署到服务器后,您无法更改适配器请求的目标。 是的,我做过一次,但这次有所不同。它不是到后端的适配器连接。它是客户端对 Wl 服务器适配器的调用。全部在客户端 - 在服务器端没有任何内容。我们正在寻找指向我们可以在 WL.Client JS 代码库中查找的位置的指针,以覆盖 WL.Client.invokeProcedure 使用的服务器域/端口。 【参考方案1】:

虽然可能,但这不是 WL 支持的。如果出现问题,您将无法从支持人员那里获得帮助(并且会出现问题)。您必须记住,所有服务器 cookie(例如会话 ID)都是每个域的。因此,当您动态更改服务器 URL 时,您将丢失它们。因此,WL 服务器会将您的请求视为新会话,与旧(现有)会话无关。这不是 WL 特有的,这就是 HTTP 的工作方式。

WL 将服务器 URL 保存在两个全局属性中 - WL.AppProp.WORKLIGHT_ROOT_URL 和 WL.AppProp.APP_SERVICES_URL。您可以覆盖它们,从而更改服务器 URL。

第一个用于由开发人员触发的所有请求(初始化、连接、登录等)。第二个用于其他内部功能(例如加密缓存)。

再一次 - 这是一个 hack,绝对不是解决方案。谨慎使用:)

【讨论】:

感谢您的快速回答。我们可以看到如何通过 WL.Client.getAppProperty 读取它,但是您建议如何覆盖这样的属性?它似乎不作为一个全局 JS 属性存在,只能在 JS 代码中设置为新值。所以我们需要覆盖 getAppProperty 函数吗? WL ajax 调用是否使用此函数在调用前获取正确的 URL? 只覆盖原始属性。例如:WL.AppProp.WORKLIGHT_ROOT_URL = "some-other-server.com:9080"; 好的。我们会努力的,谢谢。只是认为,由于 WL.Logger.log( WL.AppProp.WORKLIGHT_ROOT_URL) 不会将属性返回/打印到控制台,因此它不是一个可以轻松覆盖的全局属性,但 WL.Client.getAppProperty 会执行其他一些“魔法”从某个地方获得财产。 参考我关于负载平衡器路由机制的部分问题。出现的一个选项是将自定义标头添加到从客户端到适配器的 AJAX 调用中。这是否可能并且可能得到 WL 的支持?我知道 HTTPAdapter 的文档,您可以在其中执行此操作。 您可以在客户端添加/删除全局标头。 pic.dhe.ibm.com/infocenter/wrklight/v6r0m0/…【参考方案2】:

如果我们定义自己的函数来调用一些静态属性并更新它们呢?

函数 changeServerUrl(serverURL)

WL.StaticAppProps.APP_SERVICES_URL = serverURL + WL.StaticAppProps.POSTFIX_APP_SERVICES_URL; WL.StaticAppProps.WORKLIGHT_ROOT_URL = serverURL + WL.StaticAppProps.POSTFIX_WORKLIGHT_ROOT_URL; WL.StaticAppProps.WORKLIGHT_BASE_URL = serverURL;

并称之为

chnageServerUrl("http://"+yourServerIP+":"+PORT);

【讨论】:

不支持。不支持您对服务器更改所做的任何事情。如果您想对此提供支持,请使用 MFP 6.3,它现在包含用于更改服务器 URL 的公共 API。【参考方案3】:

如果您深入研究 worklight.js 文件,则有一个函数“setWLUrl(url)”可用于更改 serevr URL。 这样称呼它就完成了

setWLUrl("http://"+yourServerIP+":PORT");

这是一种 hack,但我认为它不应该有任何问题,因为它是 api 中的一个函数。

祝你好运

【讨论】:

非常糟糕的做法 - 任何工作灯用户都不应该这样做。不要听从这个建议。

以上是关于通过不同的 URL 将一些 WL.Client 适配器调用流量重新路由/转移到 WL 服务器(用于 PCI 支付和安全要求)?的主要内容,如果未能解决你的问题,请参考以下文章

IBM Worklight:WL.Client.getUserName 无法在身份验证后立即检索 userIdentity

“WL.Client.Push”的值未定义

WL.Client.createChallengeHandler 的参数有啥意义?

MFP 6.3 - WL.Client.makeRequest - 已弃用

使用 WL.Client.reloadApp 重新加载应用程序时是不是调用 wlcommoninit

WL.Client.connect onSuccess 回调不会被调用