框架:springboot框架
java版本:JDK8
需求:java类中要调用js文件中的函数,该函数又调用了另一个js文件的函数。
解决方案:
一、将所有的js文件合并到一个js文件中,java调用单个js文件的例子,网上很多,不赘述。
二、依次读取多个js文件到scriptEngine,代码如下:
public static String getRsaPass(String pass, String enc, String mod) {
try {
String result = "";
String md5p = MD5Util.MD5(pass).toLowerCase();
ScriptEngineManager manager = new ScriptEngineManager();
//创建javascript引擎
ScriptEngine engine = manager.getEngineByName("javascript");
//依次读取多个js文件
ClassPathResource resource = new
ClassPathResource("/static/js/login/SecurityUtil.js");
File file = resource.getFile();
FileReader reader = new FileReader(file);
ClassPathResource resource2 = new ClassPathResource("/static/js/login/RsaUtils.js");
File file2 = resource2.getFile();
FileReader reader2 = new FileReader(file2);
ClassPathResource resource3 = new ClassPathResource("/static/js/login/RandomUtil.js");
File file3 = resource3.getFile();
FileReader reader3 = new FileReader(file3);
engine.eval(reader);
engine.eval(reader2);
engine.eval(reader3);
if(engine instanceof Invocable) {
Invocable invoke = (Invocable)engine;
//调用函数,第一个是js的函数名,后边的是函数的参数
result = (String)invoke.invokeFunction("createSecurityData", enc,mod,pass,md5p);
}else {
System.out.println("read file error");
}
reader.close();
reader2.close();
reader3.close();
return result;
}catch(Exception e) {
e.printStackTrace();
return null;
}
}
js文件的路径位置:
SecuritUtil.js文件的内容如下:
function createSecurityData(e,m,pwd,md5v){
var random=getRandomString(10);
var key=RSAUtils.getKeyPair(e,'',m);
var envilope=md5v+'!,!'+random+'!,!'+pwd;
return RSAUtils.encryptedString(key,envilope)
}
getRandomString()这个函数在RandomUtil.js文件中,代码如下:
function getRandomString(len) {
len = len || 32;
var chars = 'ABCDEFGHJKMNPQRSTWXYZabcdefhijkmnprstwxyz2345678';
var maxPos = chars.length;
var pwd = '';
for (var i = 0; i <= len - 1; i++) {
pwd += chars.charAt(Math.floor(Math.random() * maxPos));
}
return pwd;
}
执行java方法,得到js的返回值。