javascript
java里面运行js_在java中利用rhino执行javascript
以rhino中執(zhí)行QQ郵箱的safeauth.js為例
js代碼地址:http://res.qqmail.com/zh_CN/htmledition20091127/js/safeauth.js
(1)導(dǎo)入相應(yīng)類
import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
import com.sun.phobos.script.javascript.RhinoScriptEngineFactory;
(2)解析JS
ScriptEngineManager engineManager = new ScriptEngineManager();
engineManager.registerEngineExtension("js", new RhinoScriptEngineFactory());
ScriptEngine engine = engineManager.getEngineByName("js");
InputStream ins = getClass().getResourceAsStream("/safeauth.js");
InputStreamReader insReader = new InputStreamReader(ins);
engine.eval(insReader);
會(huì)報(bào)錯(cuò),說找不到window,navigator對(duì)象
這是因?yàn)閞hino只提供了執(zhí)行腳本的引擎環(huán)境,沒有提供類似瀏覽器的host環(huán)境,所以當(dāng)然找不到這兩個(gè)對(duì)象
將相應(yīng)的帶有window,navigator的行注釋掉,并加入以下代碼,構(gòu)成新的safeauth.js文件:
//-- encrypt password --//
function encryptPassword(pp, PublicKey, PublicTs) {
print("pp=" + pp + "\n");
print("PublicKey=" + PublicKey + "\n");
print("PublicTs=" + PublicTs + "\n");
var RSA = new RSAKey();
RSA.setPublic(PublicKey, "10001");
var Res = RSA.encrypt(pp + '\n' + PublicTs + '\n');
if (Res){
return hex2b64(Res);
} else {
return "EncodingPasswordError";
}
}
(3)執(zhí)行JS:
engine.eval("var t=encryptPassword('" + pp + "','" + publicKey + "','" + publicTs + "');");
String p = engine.get("t").toString();
傳入pp(密碼域值),publicKey和publicTs(這兩個(gè)值從http://mail.qq.com/cgi-bin/loginpage頁(yè)面內(nèi)容得到),即可以計(jì)算編碼后的密碼。
總結(jié)
以上是生活随笔為你收集整理的java里面运行js_在java中利用rhino执行javascript的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 三星电子开发出透光率达 88% 的 EU
- 下一篇: 尼泊尔客机坠毁:机上72人不幸全部遇难