Java执行js加密算法

明白需求以后疯狂百度。最后发现JDK提供了各种脚本的支持(怪笔者学艺不精,第一次见识到这个库,留下不学无术的泪水),正题开始,Java如何执行一段加密算法呢?

java对脚本的支持全部存放于javax.script包下

接口:
Bindlings
Compilable
Invocable
ScriptContext
ScriptEngine
ScriptEngineFactory
类:
AbstractScriptEngine
CompiledScript
ScriptEngineManager
SimpleBindings
SimpleScriptContext
异常:
ScriptException

我们本次使用到的有ScriptEngineManagerScriptEngineInvocable

我们通过ScriptEngineManager获取指定脚本语言的执行引擎(ScriptEngine),然后调用eval()执行脚本代码,再加该脚本引擎转换为Invocable接口,该接口由NashornScriptEngine实现,并且这个实现类中定义了invokeFunction方法来执行这段代码。同时它也定义了getInterface方法来将js代码作为传入接口的实现,来调用这个方法。

public static String playJS(String str){
//获取脚本引擎管理器
ScriptEngineManager scriptEngineManager = new ScriptEngineManager();
//获取指定脚本的引擎管理器
ScriptEngine js = scriptEngineManager.getEngineByName("js");
//conwork.js文件是一个js的加密算法
InputStream resource = PlayJS.class.getClassLoader().getResourceAsStream("conwork.js");
try {
Reader reader = new BufferedReader(new InputStreamReader(resource,"utf-8"));
//执行脚本
js.eval(reader);
if(js instanceof Invocable){
//将脚本引擎转换Invocable
Invocable invocable = (Invocable) js;
// 将js代码转换为该接口的实现,Method是自定义的接口,用来存放加密算法
Methods executeMethod = invocable.getInterface(Methods.class);
// 执行指定的js方法
return executeMethod.encodeInp(str);
}
} catch (ScriptException e) {
e.printStackTrace();
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
return null ;
}

Methods接口

public interface Methods {
public String encodeInp(String input);
}

此时,调用playJS方法传入的数据,就是加密以后的数据

接下来玩一个更好玩的,JavaScript代码中执行Java代码

  1. 定义一个静态方法
static String fun1(String name){
System.out.format("this is java code , %s"+name);
return "thank you";
}
  1. 在JavaScript代码中导入类
//通过Java.type(),这个代码相当于Java代码的import导入类
var myTestClass = Java.ype("com.bywlstuido.MyTestClass");
//有了Java类的原型,就可以调用类中的静态方法了
var result = myTestClass.fun1("JS invoke");
print(result); //this is java code ,JS invoke
//thank you

执行完毕

05-11 20:01
查看更多