我想控制我的应用可以连接到哪些公共 IP 地址,以便我可以将一小组 IP 列入黑名单,以用于整个应用的传出连接。
将 Tomcat Java 应用程序部署到 Heroku,我通过覆盖“java.security.properties”指定了自定义 Java 安全配置
web: java $JAVA_OPTS -Djava.security.properties=java.security -jar target/dependency/webapp-runner.jar --port $PORT target/*.war
在该配置中,我给出了一个自定义 SSLSocketFactory 类
ssl.SocketFactory.provider=security.MyCustomSocketFactory
这允许 MyCustomSocketFactory 在一个小型示例应用程序中检查每个 IP 地址和主机的传出连接。但是,在我部署到 Heroku 后,它不适用于我的完整应用程序。找不到该类,即使它已打包到 .war 文件中。
Caused by: java.lang.ClassNotFoundException: security.MyCustomSocketFactory
at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:582)
at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:185)
at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:496)
at java.base/javax.net.ssl.SSLSocketFactory.getDefault(SSLSocketFactory.java:105)
at java.base/javax.net.ssl.HttpsURLConnection.getDefaultSSLSocketFactory(HttpsURLConnection.java:335)
at java.base/javax.net.ssl.HttpsURLConnection.<init>(HttpsURLConnection.java:292)
我想我必须指定我的单个类的类加载方式不同,因为我的应用程序是由 webapp-runner.jar 初始化的。我应该采取不同的方法吗?
我知道我的类可用于某些类加载器,因为我可以Class.forName()
从我自己的代码中调用,而不会出现异常。但它只是无法从SSLSocketFactory.getDefault()
.