在 Java 应用程序中多次添加安全提供程序
Posted
技术标签:
【中文标题】在 Java 应用程序中多次添加安全提供程序【英文标题】:Adding Security Provider multiple times in Java application 【发布时间】:2017-12-25 03:52:23 【问题描述】:我们有一个 Java 应用程序,其中计划每 5 分钟运行一次作业。在该作业中,有一个安全组件在每次执行时都会执行以下操作:
java.security.Security
.addProvider(new org.bouncycastle.jce.provider.BouncyCastleProvider());
我的问题是:
-
是否需要在应用程序中多次添加安全提供程序?它有什么用途吗?对我来说,它没有意义,添加一次就足够了。
它是否是应用程序中潜在内存泄漏的候选者?
为了澄清,我想在我的应用程序中以编程方式添加 Bouncy Castle 安全提供程序,而不是通过 JRE 静态添加。 IMO,在应用程序中添加一次 Bouncy Castle 安全提供程序就足够了,我不需要多次这样做。
【问题讨论】:
【参考方案1】:根据addProvider
's javadoc:
回报: 添加提供程序的首选项位置,或 -1 如果提供程序由于已安装而未添加
addProvider
已经检查了提供程序是否已安装,因此,即使您的应用程序中有多个调用,它也只会添加一次。添加之后,它会一直保留到 JVM 停止(或者如果有人调用 removeProvider
)。
当然,您可以对其进行优化并在主类(您知道它总是在应用程序启动时加载的某个类)中只调用一次,但我不会太担心。
我曾使用过在不同部分多次调用 addProvider
的系统(因为它们可以按任何顺序调用并且彼此独立),所有这些系统都在同一个 JVM 中运行,但它从来没有得到任何内存泄漏。当然这只是我的情况,但我不知道这会导致泄漏。
如果您只想在尚未添加提供程序的情况下调用addProvider
,您可以调用Security.getProvider()
进行检查。如果提供者不在JVM中,则返回null
:
// add provider only if it's not in the JVM
if (Security.getProvider(BouncyCastleProvider.PROVIDER_NAME) == null)
Security.addProvider(new BouncyCastleProvider());
【讨论】:
请注意,由于存在错误,您应该使用 only-add-if-not-there 加载样式。错误问题:bugs.openjdk.java.net/browse/JDK-8168469以上是关于在 Java 应用程序中多次添加安全提供程序的主要内容,如果未能解决你的问题,请参考以下文章
Java 列表项在页面重新加载时重新添加到 thymeleaf 下拉列表中,多次出现