0

我想控制我的应用可以连接到哪些公共 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().

4

1 回答 1

0

正如codefinger在评论中建议的那样,我需要在 war 文件之外的类路径中包含 MyCustomSocketFactory。

我将 MyCustomSocketFactory 移至单独的 Maven 项目,并将其构建为单独的 jar。

然后,我在我的主项目上添加了一个构建步骤,将 JAR 复制到与 webapp-runner.jar 相同的目录中。

<plugin>
    <artifactId>maven-resources-plugin</artifactId>
    <version>3.1.0</version>
    <executions>
        <execution>
            <id>copy-socketblocker</id>
            <phase>package</phase>
            <goals>
                <goal>copy-resources</goal>
            </goals>
            <configuration>
  <outputDirectory>${basedir}/target/dependency</outputDirectory>
                <resources>
                    <resource>
                        <directory>jars</directory>
                        <includes>socketblocker-1.0.jar</includes>
                    </resource>
                </resources>
            </configuration>
        </execution>
    </executions>
</plugin>

最后,我修改了我的 Procfile 以使用通配符匹配,并将 webapp-runner.jar 和我的自定义 JAR 作为类路径条目添加。

web: java $JAVA_OPTS -Djava.security.properties=java.security -cp "target/dependency/*" webapp.runner.launch.Main --port $PORT target/*.war
于 2019-01-07T00:06:54.647 回答