首页 文章

为什么tomcat servlets不使用JVM参数http.proxyHost?

提问于
浏览
0

我有一个黑盒子servlet,它通过 ebMS (smtp / pop?)向其他服务器发送消息 . 我已经将servlet放在Linux(centOS)服务器上的Tomcat 8.0.30中,并且经过测试的消息可以通过互联网发送到其他主机 . 我现在想通过Tomcat JVM参数为servlet设置代理,如下所示:

#tomcat/bin/catalina.sh
export CATALINA_OPTS="-Dhttps.proxyHost=abc.com -Dhttps.proxyPort=8888 -DproxySet=true -Dhttp.proxyHost=def.com -Dhttp.proxyPort=8888"

我决定首先用假的proxyHost测试它,如果消息无法发送,它将证明servlet确实使用了指定的代理设置 .

重启服务后,参数将传递给tomcat,如 tomcat/log/catalina.2016-01-08.log 所示:

08-Jan-2016 11:39:53.725 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: -Dhttps.proxyHost=abc.com
08-Jan-2016 11:39:53.725 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: -Dhttps.proxyPort=8888
08-Jan-2016 11:39:53.725 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: -DproxySet=true
08-Jan-2016 11:39:53.725 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: -Dhttp.proxyHost=def.com
08-Jan-2016 11:39:53.725 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: -Dhttp.proxyPort=8888
...
08-Jan-2016 11:39:59.195 INFO [main] org.apache.catalina.startup.Catalina.start Server startup in 5297 ms

但是,当我测试servlet(通过.sh调用java类)时,消息成功传递,并可以通过Internet在接收器上接收 . 不应用proxyHost参数 .

我在这里想念的是什么? servlet是否可以覆盖代理设置?或者tomcat在给定的代理无法解析/超时后禁用代理设置?

非常感谢任何见解 . 谢谢 .

1 回答

  • 0

    我会在这里标记上述问题的答案,以防有人觉得有用 .

    servlet是否可以覆盖代理设置?

    是的 . 我写了一个测试页打印出 System.getProperty("http.proxyHost") ,当我传递给JVM时它不是 abc.com . 目录 /opt/tomcat/webapps/<servlet-name>/WEB-INF/classes/... 下有一个 <servlet-name>.properties.xml ,它包含一些JVM参数,包括xml格式的 http.proxyHost . servlet可能在启动时对这些参数调用System.setProperty,因此覆盖了传递的值 .

    在给定代理无法解析/超时后,tomcat是否会禁用代理设置?

    是的,它会的 . 根据this question,代理集必须"points to an accessible address"否则 ProxySelector 将不会返回 .

    当proxyHost设置为指向上述 .properties.xml 中的工作代理服务器时, System.getProperty("http.proxyHost") 将打印正确的主机并且可以传递消息 . 当我将其指向活动但不转发服务器时, System.getProperty("http.proxyHost") 打印正确的主机,并且消息按预期成功 blocked .

相关问题