在XPages中使用jsSHA库报错:ReferenceError 'jsSHA'未找到
解决XPages中jsSHA的ReferenceError问题
嘿,我一眼就看出你碰到的问题根源了:你在服务器端的计算字段里调用了客户端JavaScript库jsSHA,这就是为什么会出现ReferenceError: 'jsSHA' not found的错误。
问题拆解
你用<xp:text>组件里的#{javascript:...}是运行在服务器端的代码,但jsSHA是纯客户端的库,只能在浏览器的前端环境里工作,服务器端根本识别不了这个对象。
至于你修改define.amd的代码,那是为了避免Dojo的AMD加载器和其他库冲突,这部分逻辑本身没问题,但和你现在遇到的错误无关——毕竟服务器端代码根本不会去加载客户端的js文件。
解决方案
要正确用jsSHA,得把相关逻辑放到客户端JavaScript里,而不是服务器端的计算字段中。下面给你两种可行的方案:
方案1:客户端执行SHA计算(用jsSHA库)
保留你现有的资源引入(包括修改define.amd的代码,确保jsSHA能正常加载),然后替换原来的服务器端计算字段,改成客户端执行的逻辑:
<xp:this.resources> <!-- temporary redefine define.amd object (Dojo AMD loader) --> <xp:script clientSide="true" type="text/javascript"> <xp:this.contents><![CDATA[${javascript:"if (typeof define === 'function' && define.amd) {if(define.amd.vendor =='dojotoolkit.org'){define._amd = define.amd;delete define.amd;}}";}]]></xp:this.contents> </xp:script> <xp:script src="sha.js" clientSide="true"></xp:script> <xp:script src="https://code.jquery.com/jquery-3.5.1.min.js" clientSide="true"></xp:script> <!-- restore define.amd object (Dojo AMD loader) --> <xp:script clientSide="true"> <xp:this.contents><![CDATA[${javascript:"if (typeof define === 'function' && define._amd) {define.amd = define._amd; delete define._amd;}"}]]></xp:this.contents> </xp:script> </xp:this.resources> <!-- 用来显示SHA计算结果的控件 --> <xp:text escape="true" id="shaResult"></xp:text> <!-- 客户端脚本:页面加载后执行SHA初始化和计算 --> <xp:script clientSide="true" type="text/javascript"> <xp:this.contents><![CDATA[ window.addEventListener('load', function() { try { // 初始化jsSHA对象 var shaObj = new jsSHA('SHA-1','HEX'); // 示例:更新要哈希的内容 shaObj.update('your_input_data_here'); // 获取十六进制哈希结果 var hashResult = shaObj.getHash('HEX'); // 将结果显示到页面控件中 document.getElementById('#{id:shaResult}').textContent = hashResult; } catch (err) { console.error('jsSHA操作出错:', err); } }); ]]></xp:this.contents> </xp:script>
方案2:服务器端执行SHA计算(不用客户端库)
如果你的需求是在服务器端完成哈希计算,那完全不需要用jsSHA——XPages本身可以直接调用Java的加密API,更靠谱:
<xp:text escape="true" id="computedField1"> <xp:this.value><![CDATA[#{javascript: // 要计算哈希的输入字符串 var input = "your_input_string"; // 获取SHA-1消息摘要实例 var md = java.security.MessageDigest.getInstance("SHA-1"); md.update(input.getBytes("UTF-8")); var hashBytes = md.digest(); // 把字节数组转换成十六进制字符串 var hashStr = ""; for (var i = 0; i < hashBytes.length; i++) { var hex = java.lang.Integer.toHexString(0xFF & hashBytes[i]); // 补零确保两位十六进制数 if (hex.length() === 1) { hashStr += "0"; } hashStr += hex; } return hashStr; }]]></xp:this.value> </xp:text>
总结
如果是前端需要哈希结果,用方案1;如果是服务器端处理,用方案2。这样就能彻底解决你碰到的ReferenceError问题啦!
内容的提问来源于stack exchange,提问作者Marc Jonkers
相关产品推荐
相关产品推荐

