我有一个黑盒子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 回答
我会在这里标记上述问题的答案,以防有人觉得有用 .
是的 . 我写了一个测试页打印出
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,因此覆盖了传递的值 .是的,它会的 . 根据this question,代理集必须"points to an accessible address"否则
ProxySelector
将不会返回 .当proxyHost设置为指向上述
.properties.xml
中的工作代理服务器时,System.getProperty("http.proxyHost")
将打印正确的主机并且可以传递消息 . 当我将其指向活动但不转发服务器时,System.getProperty("http.proxyHost")
打印正确的主机,并且消息按预期成功 blocked .