我的GWT app(2.1.0)允许用户选择不同的数据组合方法。它们可以平均,找到方差等。我使用枚举来实现这种效果,该枚举指定使用哪种方法。
现在我想为各个客户端编写自定义方法。例如,有人可以请求MODE功能。
一种解决方案是将MODE添加到枚举,编写getMode()函数,并将其添加到应用程序。问题在于10,000个自定义选项。我不介意编写 10,000种不同的方法,但我不希望所有10,000个函数都被发送到每个客户端。实际上,我想确保一个客户端无法看到另一个客户端方法的实现,该方法可能包含私有数据。
GWT.runAsync可以帮助我将所有这些方法拆分成不同的块,只有在用户请求时才会下载。有没有办法在下载该代码之前运行某种权限检查?例如,我不希望有人更改其枚举指定首选项的值来欺骗(私有)代码进行下载。
我在java GAE上运行它。我可以在下载cachedjs文件之前编写一个过滤器来进行权限检查,但由于GWT文件的名称在每次编译后都会发生变化,我无法想到以一种有意义的方式控制对不同块的访问。
我希望这很清楚。感谢您的任何指示!
答案 0 :(得分:1)
如果您真的担心源代码的安全性,我会将您的私有算法实现保留在服务器上。有人可以轻松查看您的来源(虽然是混淆)并下载任何延迟来源(也是混淆)。
如果您使用延迟绑定(runAsync),您将在主.cache.html文件的顶部看到类似的内容:
// spacing modified for readability
var $strongName = '02F159CD1F48EEB372B36E0BA704A0BE';
function __gwtStartLoadingFragment(frag) {
return $moduleBase + 'deferredjs/' + $strongName + '/' + frag + '.cache.js';
}
考虑到这一点,可以确定下载延迟代码源的路径。如果您的服务器允许它(因为检查特定片段的权限可能很难),它将被提供。
如果您将代码保留在服务器上,则可以在返回结果之前创建rpc服务并检查服务器上的权限。如果您不想拥有一堆服务方法,请使用调度方法的名称和计算数据创建一个。
如果您需要在客户端上运行算法,则可以通过RPC服务动态提供代码并在客户端上执行eval()来更轻松地保护代码。这需要在Javascript而不是GWT中实现您的算法(其余代码仍然是GWT)。
1)创建一个服务器实现的服务方法,如下所示:
public String getAlgorithmCode(String name) {
// locate the code. store it in a file, database, cache it in memory, etc.
// ...
return javascriptSourceCode;
}
2)将javascript加载到页面中。由于你只是在GWT代码中使用它,你可以在当前帧中eval()它,但如果你想将它加载到$ wnd,请查看这篇文章。
http://blog.lexspoon.org/2009/03/many-scopes-of-javascripts-eval.html
如果使用相同的命名约定和函数签名编写javascript实现,则可以使用JSNI调用它。
3)当需要调用此方法时,您可以检查函数是否已定义。
如果它不存在,请使用该服务获取它。
如果存在,请使用此处Calling dynamic function with dynamic parameters in Javascript
所述的方式调用它答案 1 :(得分:0)
在测试中包裹runAsync()
来电。
if (testPermission()) {
GWT.runAsync(...);
}
或者,如果您想要拨打服务
myService.testPermissions(user, new AsyncCallback() {
@Override
public void onFailure(Throwable caught) {
...
}
public void onSuccess(Boolean hasPermission) {
GWT.runAsync(...);
}
});