java - Groovy 沙箱和 Java : execute Groovy script

标签 java groovy sandbox

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

要执行的 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 Controller 获取 script 参数等于“query.reverse()”和query 参数等于“0123”
  • Groovy 文件在沙箱中执行脚本“query.reverse()”,其中query 等于“0123”
  • 结果等于“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();
}

关于java - Groovy 沙箱和 Java : execute Groovy script,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23543691/

相关文章:

java - 实体类应该实现接口(interface)吗?

grails - 将枚举列表传递给条件

actionscript-3 - AIR 将服务器托管的 swf 加载到同一沙箱中

Jenkins Groovy unix 脚本错误 java.lang.NoSuchMethodError : 'boolean mightBePositionalArgumentConstructor VariableExpression

grails - 如何导入groovyx.net.http

c# - 沙盒异常 "Derived types must either match the security accessibility of the base type or be less accessible."

c++ - 在沙盒中运行插件

java - 从文件到数组列表,从数组列表到数组[]

java - 模型属性为空

java - android 将数据库从 Assets 复制到 sdcard - 打开失败 : EISDIR (Is a directory)