首页 > 其他分享 >groovy语法校验和沙盒(sandbox)运行

groovy语法校验和沙盒(sandbox)运行

时间:2022-11-24 18:02:14浏览次数:45  
标签:groovy receiver new sandbox import org 沙盒 method


groovy语法校验主要解决脚本在编写时能实时检查语法是否正确,类似IDE的功能,沙盒运行主要解决系统若嵌入System.exit(0),会导致整个应用停掉的问题

需要引用的依赖包如下:

<!-- https://mvnrepository.com/artifact/org.codehaus.groovy/groovy-all -->
<dependency>
<groupId>org.codehaus.groovy</groupId>
<artifactId>groovy-all</artifactId>
<version>2.4.7</version>
</dependency>

<!-- https://mvnrepository.com/artifact/org.codehaus.groovy/groovy -->
<dependency>
<groupId>org.codehaus.groovy</groupId>
<artifactId>groovy</artifactId>
<version>2.4.7</version>
</dependency>

<dependency>
<groupId>org.kohsuke</groupId>
<artifactId>groovy-sandbox</artifactId>
<version>1.6</version>
</dependency>

方法很简单,test类如下:

import groovy.lang.GroovyShell;
import org.codehaus.groovy.control.CompilerConfiguration;
import org.codehaus.groovy.control.ErrorCollector;
import org.codehaus.groovy.control.MultipleCompilationErrorsException;
import org.junit.Test;
import org.kohsuke.groovy.sandbox.GroovyInterceptor;
import org.kohsuke.groovy.sandbox.SandboxTransformer;

/**
* @author wulongtao
*/
public class GroovyTest {

/**
* 语法校验
*/
@Test
public void grammarCheck() {
try {
String expression = "if(a==1) return 1;";
new GroovyShell().parse(expression);
} catch(MultipleCompilationErrorsException cfe) {
ErrorCollector errorCollector = cfe.getErrorCollector();
System.out.println("Errors: "+errorCollector.getErrorCount());
}
}


class NoSystemExitSandbox extends GroovyInterceptor {
@Override
public Object onStaticCall(GroovyInterceptor.Invoker invoker, Class receiver, String method, Object... args) throws Throwable {
if (receiver==System.class && method=="exit")
throw new SecurityException("No call on System.exit() please");
return super.onStaticCall(invoker, receiver, method, args);
}
}

class NoRunTimeSandbox extends GroovyInterceptor {
@Override
public Object onStaticCall(GroovyInterceptor.Invoker invoker, Class receiver, String method, Object... args) throws Throwable {
if (receiver==Runtime.class)
throw new SecurityException("No call on RunTime please");
return super.onStaticCall(invoker, receiver, method, args);
}
}

/**
* 沙盒运行
*/
@Test
public void sandboxRun() {

final GroovyShell sh = new GroovyShell(new CompilerConfiguration()
.addCompilationCustomizers(new SandboxTransformer()));
new NoSystemExitSandbox().register();
new NoRunTimeSandbox().register();
sh.evaluate("System.exit(0)");
}

}


标签:groovy,receiver,new,sandbox,import,org,沙盒,method
From: https://blog.51cto.com/u_15890522/5884430

相关文章

  • Apple开发_应用沙盒
    1、Sandbox沙箱介绍iOS为每个应用提供了独立的文件空间,一个应用只能直接访问为本应用分配的文件目录,不可以访问其他目录,每个应用自己独立的访问空间被称为该应用的沙盒......
  • [笔记] 什么是Groovy?
    关于Groovy参考文章https://www.w3cschool.cn/groovy/摘抄如下:Groovy是JVM的一个替代语言(替代是指可以用 Groovy 在Java平台上进行 Java 编程),使用方式基本与使用 ......
  • idea 方法格式化中param的groovy表达式
    groovyScript("defresult='';defparams=\"${_1}\".replaceAll('[\\\\[|\\\\]|\\\\s]','').split(',').toList();for(i=0;i<params.size();i++){if(params[......
  • groovy 脚本实例 创建和升级脚本
    groovy脚本实例创建和升级脚本packageplatform.jfrog_artifact.snapshot.mysql.empty2_docker_dbnode('ecs_wuhan_docker'){println"${BUILD_URL}console"......
  • Groovy Swagger @requestBody 加载超时 一键搞定
    最近在写一个Springboot项目时,需要接入Swagger功能,过程中遇到了几个问题,其中就数@requestBody不兼容Swagger的情况最难受,其他还有遇到问题,这里整理一下,分享一下解决方案。这......
  • Gradle基础知识-Wrapper,Daeman;Groovy闭包语法
    gradledescirbe:gradle本质就是一个bin脚本,分为window和unix。启动gradle:启动jvm加载lib所需的库gradlewrapper输入gradlewrapper命令会在当前目录创建安装一个jar包......
  • 使用 Kotlin , Groovy ,Java 开发一个自己的 Gradle 插件
    使用Kotlin,Groovy,Java开发一个自己的Gradle插件先上效果图:image.png功能说明:korGenerate:自动生成Entity,Dao,Controller模板代码korFront:自动cop......
  • Groovy
    介绍闭包闭包是可以引用外部上下文的一系列语句。可以将闭包赋值给一个变量,并在稍候执行。每个闭包都有一个返回值,默认的返回值就是闭包最后一行语句的结果。函数必须......
  • virtualenv--python沙盒环境安装
    有人说:virtualenv、fabric和pip是pythoneer的三大神器,今天学习安装下virtualenvvirtualenv可以搭建虚拟且独立的python环境,可以使每个项目环境与其他项目独立开来,保持......
  • 找不到虚拟机监控程序,请启用虚拟机监控程序支持(打开Windows Sandbox提示)
      本机安装了VM,所以为支持VM对系统做了些配置。具体原因是因为兼容性问题。上述解决办法:1、确保沙盒和监控程序功能启用 2、在 WindowsPowershell(管理员) 中执行......