网站建设冫首先金手指十五/厉害的seo顾问

Java执行js加密算法
今日需求:在后端执行一段加密算法,算法是js写的
明白需求以后疯狂百度。最后发现JDK
提供了各种脚本的支持(怪笔者学艺不精,第一次见识到这个库,留下不学无术的泪水),正题开始,Java如何执行一段加密算法呢?
java
对脚本的支持全部存放于javax.script
包下
接口:BindlingsCompilable Invocable ScriptContext ScriptEngine ScriptEngineFactory
类:AbstractScriptEngine CompiledScript ScriptEngineManager SimpleBindings SimpleScriptContext
异常:ScriptException
我们本次使用到的有ScriptEngineManager
,ScriptEngine
,Invocable
ScriptEngineManager
为ScriptEngine
类实现一个发现和实例化机制,还维护一个键/值对集合来存储所有 Manager 创建的引擎所共享的状态。此类使用[服务提供者](../../../technotes/guides/jar/jar.html#Service Provider)机制枚举所有的ScriptEngineFactory
实现。ScriptEngineManager
提供了一个方法,可以返回一个所有工厂实现和基于语言名称、文件扩展名和 mime 类型查找工厂的实用方法所组成的数组。
键/值对的Bindings
(即由管理器维护的 "Global Scope")对于ScriptEngineManager
创建的所有ScriptEngine
实例都是可用的。Bindings
中的值通常公开于所有脚本中。
JDK官方解释
我们通过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){//将脚本引擎转换InvocableInvocable 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代码
- 定义一个静态方法
static String fun1(String name){System.out.format("this is java code , %s"+name);return "thank you";
}
- 在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
执行完毕