2

我想在我的 GWT 项目(客户端)中使用外部加密库。(特别是斯坦福 Javascript 加密库,http ://crypto.stanford.edu/sjcl/ 我在项目的 gwt 配置文件(MyProj.gwt.xml)中添加了这些行

<script src="libs/sjcl/sjcl.js" />
<script src="libs/sjcl/core/sha256.js" />

并在我的安全类中创建了一个新方法:

public static native String sha256(String ptext)
      /*-{
       return sjcl.hash.sha256.hash(ptext);
       }-*/;

但是当我调用它时

String result = Security.sha256("password");

我收到一个错误(“未定义 sjcl”)

如果知道这些问题和 javasript 的人可以阅读该库并告诉我正确的方法,我将节省大量时间和精力 - 无需挖掘可怕的 JavaScript。

升级版:

我首先想到的是,外部库必须在 /war 目录中其次,如果我将以下内容添加到 gwt.xml 文件中,我无法让 GWT 导入 *.js 文件

<script src="libs/sjcl/sjcl.js"></script>
<script src="libs/sjcl/core/sha256.js"></script>

我不得不在入口点的 html 源代码中添加类似的行

<script src="/sjcl/sjcl.js"></script>
<script src="/sjcl/core/sha256.js"></script>

这样导入就可以了,我可以用 Chrome Inspector 检查它

我尝试使用另一个库,没有 sjcl 那么复杂,而且效果很好。所以,显然,我没有正确使用 sjcl。另一个库更简单,只是纯方法,sjcl 使用类和东西,但由于我根本不懂 JS,如果不深入研究 JS 语法,我无法弄清楚如何正确调用这些东西。我真的很想跳过这部分。

任何人都可以查看 sjcl 代码并告诉我如何正确调用该方法吗?源码真的很小,我觉得JS pro一看就知道。

UPD 2:原来在gwt.xml中加入下面的代码就够了,只要把library放到/war中,注意路径中前面的“/”。如果你不把它放在那里,GWT 将在模块目录中为你寻找 lib

UPD 3:不要忘记清除浏览器的缓存,否则“未找到”错误不会消失

4

2 回答 2

3

确保当您在全局上下文中讨论对象时,您使用前缀$wnd,表示应用程序正在运行的主window实例。这在 JSNI 文档中有所记录,请参阅https://developers.google.com/web-工具包/doc/latest/DevGuideCodingBasicsJSNI#writing

public static native String sha256(String ptext)
  /*-{
      return $wnd.sjcl.hash.sha256.hash(ptext);
  }-*/;
于 2012-04-20T04:09:52.453 回答
0

“sjcl 未定义”表示您没有正确导入 sjcl 文件。检查文件路径并确保浏览器可以访问该文件。

于 2012-04-20T03:20:17.583 回答