android java 调用js方法,【Android】java中调用JS的方法

最近因为学校换了新的教务系统,想做一个模拟登陆功能,发现登陆的账号和密码有一个js脚本来进行加密

整理了一下java中执行JS的方法

智强教务 账号 密码 加密方法

var keyStr = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";functionencodeInp(input) {var output = "";var chr1, chr2, chr3 = "";var enc1, enc2, enc3, enc4 = "";var i = 0;do{

chr1= input.charCodeAt(i++);

chr2= input.charCodeAt(i++);

chr3= input.charCodeAt(i++);

enc1= chr1 >> 2;

enc2= ((chr1 & 3) << 4) | (chr2 >> 4);

enc3= ((chr2 & 15) << 2) | (chr3 >> 6);

enc4= chr3 & 63;if(isNaN(chr2)) {

enc3= enc4 = 64}else if(isNaN(chr3)) {

enc4= 64}

output= output + keyStr.charAt(enc1) + keyStr.charAt(enc2) + keyStr.charAt(enc3) +keyStr.charAt(enc4);

chr1= chr2 = chr3 = "";

enc1= enc2 = enc3 = enc4 = ""}while (i

}

Java

首先需要创建一个接口,接口中的抽象方法要和js中函数名保持一致

public interfaceMethods {publicString encodeInp(String input);

}

然后在主函数中使用ScriptEngineManager来加载js

ScriptEngineManager manager = newScriptEngineManager();

ScriptEngine engine= manager.getEngineByName("javascript");

FileReader fileReader=new FileReader("F:\\JAVAProject\\src\\conwork.js");//js路径

engine.eval(fileReader);if (engine instanceofInvocable) {

Invocable invocable=(Invocable) engine;

Methods executeMethod= invocable.getInterface(Methods.class);

System.out.println(executeMethod.encodeInp("account"));

System.out.println(executeMethod.encodeInp("password"));

}

Android

由于安卓中没有ScriptEngineManager ,引入jar包后也无法使用(囧)

故使用J2V8这个第三方库来进行加载

implementation ‘com.eclipsesource.j2v8:j2v8:[email protected]

将js文件放在assets文件夹下

然后在Activity中调用

publicString encodeNumber()

{

String result="没有";

InputStream is= null; //获取用户名与密码加密的js代码

try{

is= getAssets().open("conwork.js");

}catch(IOException e) {

e.printStackTrace();

}

BufferedReader reader= new BufferedReader(newInputStreamReader(is));

StringBuilder sb= newStringBuilder();

String line= null;try{while ((line = reader.readLine()) != null) {

sb.append(line);

}

V8 runtime= V8.createV8Runtime(); //使用J2V8运行js代码并将编码结果返回

final String encodename =runtime.executeStringScript(sb.toString()+ "encodeInp(‘account‘);\n");final String encodepwd=runtime.executeStringScript(sb.toString()+"encodeInp(password‘);\n");

runtime.release();

result=encodename+"%%%"+encodepwd;

}catch(IOException e) {

e.printStackTrace();

}finally{try{

is.close();

}catch(IOException e) {

e.printStackTrace();

}

}returnresult;

}

原文:https://www.cnblogs.com/robotpaul/p/11165783.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值