任务:使用 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/