java脚本引擎执行javascript代码
ScriptEngine engine = new ScriptEngineManager().getEngineByName("nashorn");
engine.eval(new FileReader("script.js"));
Invocable invocable = (Invocable) engine;
Object result = invocable.invokeFunction("sayHi", "JAVA");
System.out.println(result);
//此处为调用控制台返回值:
//hello js,my name is JAVA
//result from js
https://www.ixigua.com/6803588759469163019?id=6803638182656082445&logTag=fc09800848cff40c6e9d
https://blog.csdn.net/vipshop_fin_dev/article/details/107901521
https://www.cnblogs.com/TT0TT/p/16270848.html
一、java执行js脚本NashornScriptEngineFactory实现白名单和黑名单
import jdk.nashorn.api.scripting.ClassFilter; import jdk.nashorn.api.scripting.NashornScriptEngineFactory; import javax.script.*; import java.util.ArrayList; import java.util.List; public class ScriptEngineManagerTest { public static void main(String[] args) throws Exception { nashornScriptEngineFactoryTest(); } private static void nashornScriptEngineFactoryTest() throws ScriptException { NashornScriptEngineFactory nashornScriptEngineFactory = new NashornScriptEngineFactory(); ScriptEngine nashornScriptEngine = nashornScriptEngineFactory.getScriptEngine(new MyClassFilter()); if (nashornScriptEngine == null) { throw new ScriptException("nashornScriptEngine is null!"); } // 获取js上下文 ScriptContext scriptContext = nashornScriptEngine.getContext(); if (scriptContext == null) { return; } Bindings bindings = scriptContext.getBindings(ScriptContext.ENGINE_SCOPE); bindings.put("name", "刘德华"); bindings.put("age", ""); bindings.put("list", ""); // 执行js语句 String js = "age = 58"; nashornScriptEngine.eval(js, bindings); System.out.println(bindings.get("age")); //在脚本中使用java // jdk1.6的用法 String importJava = "importPackage(java.util);list = Arrays.asList([\"嘻嘻\",\"哈哈\",\"咕咕\"]);"; // jdk1.8的用法 String jsCode1 = "var list = java.util.Arrays.asList([\"北京尚学堂\",\"清华大学\",\"北京大学\"]);"; nashornScriptEngine.eval(jsCode1, bindings); System.out.println(bindings.get("list")); } } class MyClassFilter implements ClassFilter { /** * * @param className js语句中一引入的java类 * @return boolean 表示是否通过,false则抛出异常 */ @Override public boolean exposeToScripts(String className) { List<String> list1 = new ArrayList<>(); list1.add("java.util.ArrayList"); list1.add("java.util.Arrays"); list1.add("java.util"); // 可以在此设置js可使用的白名单 if (list1.contains(className)) { return true; } List<String> list2 = new ArrayList<>(); // 或黑名单 if (list2.contains(className)) { return false; } return false; } }


浙公网安备 33010602011771号