JFrame 中的沙箱 JPanel

Posted

技术标签:

【中文标题】JFrame 中的沙箱 JPanel【英文标题】:Sandbox JPanel within JFrame 【发布时间】:2013-08-30 09:52:43 【问题描述】:

我有一个 JFrame,里面有一个 JPanel。我正在加载一些不受信任的第 3 方代码,这些代码需要向我的 JPanel 添加一些组件。如何对我的 JPanel 进行沙箱处理,以使第 3 方组件无法访问 JPanel 之外的资源(例如 JFrame)?

【问题讨论】:

您可以尝试在基于安全的类加载器中加载第 3 方代码。我自己没有这样做,但你可以看看this 您查看过Security Manager 吗? 安全管理器不处理文件访问之类的事情吗?我不知道它可以像 Flavio 想要的那样限制对对象的访问。 【参考方案1】:

这将很困难,因为您的 JPanel 扩展了具有 getParent() 的 JComponent,它将返回您的 JFrame...由于 Swing 中的每个组件都实现了它,因此您的第三方组件很可能也实现了它。 您可以尝试覆盖这些方法,但我不认为 swing 仍然可以正常工作,因为这样做会切断 ComponentTree...

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

【讨论】:

对不起,我忘了提。我正在使用 URLClassLoader 在运行时加载代码。基本上我动态加载类,创建一个新实例,然后在该实例上调用一些方法,这些方法返回 SWING 组件,如 JPanel 或 JButton。我是否应该创建一个新的 JFrame 而不是将它们添加到 JPanel 中? 嗯,JFrame 将是 ComponentTree 的根。这对我来说听起来不错。但这会改变 gui 的使用和设计……也许限制对文件系统和网络的访问更为重要。即使您找到了限制对 Swing 类的访问的方法,也不会限制外部代码访问本地机器上的其他数据并将其发送到 Internet 上的某个服务器。 实际上我确实有一个自定义的 SecurityManager。在我的窗口上“安全地”加载外部组件是我无法解决的唯一问题,因为例如他们可以调用 .getParent() 并对其进行修改。创建一个新的 JFrame 可能会起作用,但它确实会弄乱整个 UI。我仍在尝试使用 JPanel 做一些有用的事情

以上是关于JFrame 中的沙箱 JPanel的主要内容,如果未能解决你的问题,请参考以下文章

将JFrame对象类作为值传递给java中的HashMap

刷新 JFrame 中的 JList

Java中的JPanel与JFrame

全屏Java中的JFrame

JFrame中的多个PNG

JFrame 中的 JPanel 有时不显示内容。为啥?