Jython:阻止对java类的访问;更改输出流
我希望在一个Java项目中使用Jython。 我想知道两件事Jython:阻止对java类的访问;更改输出流,java,jython,Java,Jython,我希望在一个Java项目中使用Jython。 我想知道两件事 我可以禁用从Python脚本访问Java类吗。也就是说,阻止脚本从java.util导入日期执行类似于的操作 我是否可以更改打印“Hello”etc写入的输出流,以便为实现重定向脚本输出 或者我必须编辑实际的Jython类才能禁用和更改它吗?为了限制对特定Java类的访问,您可以实现自定义类加载器并将其注册到Jython: this.pyInterpreter.getSystemState().setClassLoader(this.
的操作
或者我必须编辑实际的Jython类才能禁用和更改它吗?为了限制对特定Java类的访问,您可以实现自定义类加载器并将其注册到Jython:
this.pyInterpreter.getSystemState().setClassLoader(this.userCodeClassLoader);
如果您这样做是因为安全问题(不允许在运行用户代码的服务器计算机上执行某些操作),那么您必须注意,Jython还提供了类加载器无法捕获的内置函数实现:
另一种方法是分析Python解析树中的所有导入。我认为最好有不止一个安全措施:
String code = "import sys\n"+"from java.io import File\n"+"sys.exit()";
AnalyzingParser anPar = new AnalyzingParser(new ANTLRStringStream(code), "", "ascii");
mod tree=anPar.parseModule();
Visitor vis = new Visitor() {
@Override
public Object visitImport(Import node) throws Exception {
System.out.println(node);
return node;
}
@Override
public Object visitImportFrom(ImportFrom node) throws Exception {
System.out.println(node);
return node;
}
};
List<PythonTree> children=tree.getChildren();
for (PythonTree c : children){
vis.visit(c);
}
String code=“从java.io导入文件导入系统\n”+“sys.exit()”;
AnalyzingParser anPar=新的AnalyzingParser(新的AntlStringStream(代码),“”,“ascii”);
mod tree=anPar.parseModule();
访客vis=新访客(){
@凌驾
公共对象visitImport(导入节点)引发异常{
System.out.println(节点);
返回节点;
}
@凌驾
公共对象visitImportFrom(ImportFrom节点)引发异常{
System.out.println(节点);
返回节点;
}
};
List children=tree.getChildren();
适用于(PythonTree c:儿童){
访问(c);
}