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;
    }
}

 

posted @ 2023-01-17 22:34  银河系的极光  阅读(624)  评论(0)    收藏  举报