近期在uniapp中使用rsa加密痴柔,但總是報(bào)錯(cuò)。報(bào)錯(cuò)如下
reportJSException >>>> exception function:createInstanceContext, exception:white screen cause create instanceContext failed,check js stack ->Exception: ReferenceError: Can't find variable: navigator
__webpack_require__@weex createInstanceContext:79:34
以上報(bào)錯(cuò)僅僅只是供參考咐吼,因?yàn)榭赡軋?bào)錯(cuò)的信息可能會(huì)不一樣吹缔,我這里報(bào)錯(cuò)信息大概總結(jié)為navigator這個(gè)對(duì)象找不到。
一锯茄、.環(huán)境
我在uniapp 上安裝的rsa加密插件是'jsencrypt'厢塘,使用npm安裝
二、現(xiàn)象
用uniapp開(kāi)發(fā)的時(shí)候撇吞,在網(wǎng)頁(yè)預(yù)覽是沒(méi)問(wèn)題的俗冻,因?yàn)榫W(wǎng)頁(yè)包含DOM和BOM以及Window對(duì)象。rsa加密會(huì)獲取window對(duì)象牍颈,所以瀏覽器預(yù)覽是沒(méi)問(wèn)題的迄薄。但是如果你一旦編譯在安卓上或者編譯在小程序上,此時(shí)問(wèn)題就會(huì)出現(xiàn)了煮岁。就會(huì)發(fā)生類似以上的報(bào)錯(cuò)
三讥蔽、分析原因
造成這樣的原因是因?yàn)閞sa加密獲取的window對(duì)象,在安卓上或者小程序上是找不到的画机,因?yàn)樾〕绦蚧蛘甙沧慷耸遣淮嬖赪indow對(duì)象的
四冶伞、解決方案
在node_modules中找到j(luò)sencrypt/bin/jsencrypt.js目錄 如下
QQ截圖20200328104635.png
;
打開(kāi)jsencrypt.js 在代碼中找到'use strict'; 在這句嚴(yán)格模式代碼下一行插入
// 用來(lái)替換 navigator
var navigator2 = {
appName: 'Netscape',
userAgent: 'Mozilla/5.0 (iPhone; CPU iPhone OS 9_1 like Mac OS X) AppleWebKit/601.1.46 (KHTML, like Gecko) Version/9.0 Mobile/13B143 Safari/601.1'
};
// 用來(lái)替換window
var window2 = {
ASN1: null,
Base64: null,
Hex: null,
crypto: null,
href: null
};
如下圖
QQ截圖20200328104833.png
將上面的代碼放入后步氏,然后ctrl+f搜索當(dāng)前js文件中的window和navigator 响禽,分別都替換為window2和navigator2。替換完成后就保存荚醒。此時(shí)再次在man.js中引入芋类。就不會(huì)報(bào)錯(cuò)。引入如下
import JSEncrypt from 'jsencrypt';
//模擬公鑰 一般是后端工程師提供
var publicKey =
"MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCJpTYsMvGsDXKgqJX10cq4iFr9/HrzP6kygjmVt1bFf7zRf1pChdFPBo4ziQn83eAb";
// rsa加密
Vue.prototype.$getRsaCode = function(str) { // 注冊(cè)方法
let pubKey = `-----BEGIN PUBLIC KEY-----${publicKey}-----END PUBLIC KEY-----`; // ES6 模板字符串 引用 rsa 公鑰
let encryptStr = new JSEncrypt();
encryptStr.setPublicKey(pubKey); // 設(shè)置 加密公鑰
let data = encryptStr.encrypt(str.toString()); // 進(jìn)行加密
return data;
}
至此界阁,問(wèn)題解決侯繁。 參考鏈接
https://www.meiwen.com.cn/subject/rwyckqtx.html