You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.09 19:47:32