我想在我的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。
UPD:
我首先想到的是,外部库必须在/ war目录中 其次,如果我将以下内容添加到gwt.xml文件中,我无法使GWT导入* .js文件
<script src="libs/sjcl/sjcl.js"></script>
<script src="libs/sjcl/core/sha256.js"></script>
我必须在Entry point的html源
中添加类似的行<script src="/sjcl/sjcl.js"></script>
<script src="/sjcl/core/sha256.js"></script>
这种方式导入有效,我可以使用Chrome Inspector
进行检查我尝试使用另一个库,不像sjcl那么复杂,而且工作正常。 所以,显然,我没有正确使用sjcl。 另一个库更简单,只是纯方法,sjcl使用类和东西,但由于我根本不了解JS,我无法弄清楚如何在不深入研究JS语法的情况下正确调用这些东西。我真的想跳过这部分。
任何人都可以查看sjcl代码并告诉我如何正确调用该方法?源代码非常小,我认为JS专业人员可以一目了然。
UPD 2: 事实证明,将以下代码添加到gwt.xml就足够了,只需将库放入/ war并注意路径中前面的“/”。如果你不把它放在那里,GWT将在模块目录中寻找你的lib
UPD 3: 并且不要忘记清除浏览器的缓存或“未找到”错误不会消失
答案 0 :(得分:2)
确保当您在全局上下文中讨论使用$wnd
作为前缀的对象时,这意味着应用程序正在运行的主window
实例。这在JSNI文档中有记录,见https://developers.google.com/web-toolkit/doc/latest/DevGuideCodingBasicsJSNI#writing。
public static native String sha256(String ptext)
/*-{
return $wnd.sjcl.hash.sha256.hash(ptext);
}-*/;
答案 1 :(得分:0)
“未定义sjcl”表示您未正确导入sjcl文件。 检查文件路径并确保浏览器可以访问该文件。