任务:使用Groovy沙箱执行groovy脚本:

  • http://groovy.codehaus.org/api/overview-summary.html
  • http://groovy-sandbox.kohsuke.org/

  • 要执行的Groovy脚本:
    query.reverse(); // QUERY is a some string that should be reversed
    

    文件“GroovyScriptSandbox.groovy”应获取两个参数(脚本和此脚本的值):
    package test.my.groovy.sandbox
    
    import org.codehaus.groovy.control.CompilerConfiguration
    import org.codehaus.groovy.control.customizers.ImportCustomizer
    import org.codehaus.groovy.control.customizers.SecureASTCustomizer
    import org.springframework.stereotype.Component
    
    
    @Component
    class GroovyScriptSandbox {
    
    def config
    def shell
    
    
        public String runScript(final String script, final String query) {
            final ImportCustomizer imports = new ImportCustomizer()
                                                    .addStarImports('groovyx.net.http')
                                                    .addStaticStars('groovyx.net.http.ContentType', 'groovyx.net.http.Method')
            config = new CompilerConfiguration()
            config.addCompilationCustomizers(imports)
            def newScript = "{ query -> " + script + "}"
    
            shell = new GroovyShell(config)
            def clos = shell.evaluate(newScript)
            return clos.call(query)
        }
    }
    

    执行“GroovyScriptSandbox.groovy”的Java方法:
    @Resource
    private GroovyScriptSandbox groovyScriptSandbox;
    
    @RequestMapping(value = "/run", method = RequestMethod.POST)
    @ResponseBody
    public String runScript(@RequestParam("script") final String script,
                           @RequestParam("query") final String query) {
        return groovyScriptSandbox.runScript(script, query);
    }
    

    在这种情况下,一切正常:
  • Java控制器获取脚本参数等于“query.reverse()”并且查询参数等于“0123”
  • Groovy文件在沙盒中执行查询“0123”的脚本“query.reverse()”
  • 结果等于“3210”

  • 问题:
    我试图用“GroovyScriptSandbox.java”替换“GroovyScriptSandbox.groovy”文件,但我不知道如何用Java编写相同的Groovy代码。

    最佳答案

    终于找到解决方法:

    public String scriptRunner(final String script, final String query) {
        final ImportCustomizer imports = new ImportCustomizer();
        imports.addStaticStars("java.lang.Math");
        imports.addStarImports("groovyx.net.http");
        imports.addStaticStars("groovyx.net.http.ContentType", "groovyx.net.http.Method");
    
        final SecureASTCustomizer secure = new SecureASTCustomizer();
        secure.setClosuresAllowed(true);
    
        final CompilerConfiguration config = new CompilerConfiguration();
        config.addCompilationCustomizers(imports, secure);
    
        final Binding intBinding = new Binding(); // alow parameters in the script
        intBinding.setVariable("query", query);
    
        final GroovyShell shell = new GroovyShell(intBinding, config); // create shall
    
        // code execution
        final Object clos = shell.evaluate(script);
    
        if (clos == null) {
            return "No result avalible!";
        }
        return clos.toString();
    }
    

    09-10 09:21
    查看更多