2013-08-30 62 views
2

我有一个Jarame和一个JPanel。我正在加载一些不可信的第三方代码,需要将一些组件添加到我的JPanel中。我如何对我的JPanel进行沙盒处理,以使第三方组件无法访问JPanel之外的资源(例如JFrame)?JFrame中的Sandbox JPanel

+0

您可以尝试在基于安全性的类加载器中加载第三方代码。你自己没有这样做,但你可以看看[这个](http://stackoverflow.com/questions/1791060/java-security-classloader) – MadProgrammer

+0

你看过[安全经理](http://docs.oracle.com .com/javase/7/docs/api/java/lang/SecurityManager.html)? – Marc

+0

安全管理员不处理文件访问等内容吗?我不知道它可以限制对象的访问,就像弗拉维奥想要的那样。 – treeno

回答

0

这会很困难,因为你的JPanel扩展了getParent()的JComponent,它将返回你的JFrame ...因为Swing中的每个组件都实现了它,所以很可能你的第三方组件也实现了它。 您可以尝试覆盖这些方法,但我不认为这个摆动仍然会正常工作,因为您可以通过这样做来削减ComponentTree ...

您能解释如何加载不受信任的代码吗?它是一个库还是你在运行时通过反射或类似的东西加载?

+0

对不起,我忘了提到这一点。我使用URLClassLoader在运行时加载代码。基本上,我动态加载类,创建一个新的实例,然后我调用该实例返回SWING组件像JPanel或JButton的一些方法。我应该创建一个新的JFrame而不是将它们添加到JPanel中吗? – Flavio

+0

嗯,JFrame将成为ComponentTree的根。这听起来不错。但是,这将改变GUI的使用和设计... 也许更重要的是限制对文件系统和网络的访问。即使你找到一种方法来限制对Swing类的访问,那也不会阻止外部代码访问本地机器上的其他数据并将它发送到Internet上的某个服务器。 – treeno

+0

其实我有一个自定义的SecurityManager。在我的窗口“安全”加载外部组件是我无法解决的唯一问题,因为例如他们可以调用.getParent()并修改它。创建一个新的JFrame可能会起作用,但它确实会混淆整个UI。我仍然试图看看我是否可以用JPanel做一些有用的事情 – Flavio