【问题标题】:Tomcat and proxy settingsTomcat 和代理设置
【发布时间】:2012-08-31 20:19:48
【问题描述】:

在 tomcat7 上运行了一个 servlet,它对第三方网站进行 web 服务调用。 该调用在 Windows 机器上运行良好,但从 tomcat 运行时失败。 Tomcat 不会自动使用 Windows 的代理设置吗? 我加了

set JAVA_OPTS=%JAVA_OPTS% "-Dhttp.proxySet=true"
set JAVA_OPTS=%JAVA_OPTS% "-Dhttp.proxyHost=IP"
set JAVA_OPTS=%JAVA_OPTS% "-Dhttp.proxyPort=8080"

到 CATALINA.BAT 和

http.proxyHost=IP
http.proxyPort=8080

到 catalina.properties 但仍然没有任何变化。 我们如何将Tomcat设置为使用windows的代理设置,有没有办法检查tomcat是否正在获取指定的代理设置?

【问题讨论】:

  • http.proxySet 什么都不做,这是一个都市神话。
  • 我明白了。你建议我如何解决这个问题。
  • http.proxyHosthttp.proxyPort 应该可以工作。您确定您的 JAVA_OPTS 变量正在生效吗?。

标签: jakarta-ee tomcat proxy tomcat7


【解决方案1】:

不,Tomcat 不会自动使用系统代理设置。

我建议你看看java.net.Proxy提供的设施。这允许您在运行时动态指定代理。系统属性有效,但它们只被读取一次,如果 Tomcat 在您设置它们之前已经将HttpURLConnection 用于自己的目的,那就结束了:设置无效。

【讨论】:

  • 所以换句话说,最好用java来做。还有 HttpURLConnection 如果已经在 Tomcat 中使用,有没有办法覆盖它?java.net.Proxy 会覆盖它们吗?
  • @icedek 当您按照建议查找 Javadoc 时,您的问题将得到解答。
  • 正如 Nicolae Petridan 所说,在代码中执行此操作可能很难维护。使用 java.net.Proxy 或系统属性,它们可以正常工作:这取决于您的用例(永久代理,因为您的服务器是公司代理,或者在每个 HTTP 请求中都不同的特定代理调用)。 Icedek 的问题可能是由于使用了另一个 JVM 而忽略了设置。另见:stackoverflow.com/questions/1432961/…
  • @spirito 如上所述,使用系统属性是不可行的。这里没有简单的答案。
【解决方案2】:

在指定代理设置时,您必须定义代理服务器名称,如下所示:

"-Dhttp.proxyHost=proxy.example.com"

【讨论】:

    【解决方案3】:

    我不同意java.net.Proxy的用法。

    如果你需要改变它会发生什么?新版本,新版本。代理的设置应该很容易。它适用于系统属性或 tomcat JAVA_OPTS。我以两种方式使用它。请注意并确保您知道加载了哪些 JAVA_OPTS,使用了哪些 java 等等,因为有些 tomcat 有自己的 java 版本。关于上一篇文章,在加载之前无法使用 java :)。所以Tomcat在使用系统属性之前不能使用它...只有当tomcat使用另一个不读取系统属性的JRE时。

    我只是测试这个设置:

    set "JAVA_OPTS=%JAVA_OPTS% -Dhttp.proxyHost=proxy.com -Dhttp.proxyPort=8080 "
    

    在 catalina.bat 中运行良好。

    【讨论】:

    • 我认为最好的解决方案。
    • 最佳解决方案并根据文档。
    • 如果你需要改变它会发生什么,你把配置元素(主机,端口)放到一个配置文件中,这就是你所需要改变的。不需要新版本,也不需要发布。
    • 对 necropost 感到抱歉,我只想告诉您,经过正确修改,此解决方案仍然有效(CentOS 7,Tomcat 8.0.53,从 .tar.gz 安装)。感谢发布解决方案的人,您恢复了我的精神健康! :D
    • 现在您可能需要设置 https 代理 -Dhttps.proxyHost=proxy.com -Dhttps.proxyPort=8080
    【解决方案4】:

    您可以使用 jProxyLoader 库。使用此库,您可以将 Tomcat 配置为仅将代理用于与特定主机的连接。在您的情况下,您可以将 Tomcat 配置为仅通过代理连接到服务于 Web 服务的主机(所有其他连接将由 Tomcat“正常”方式处理 - 没有代理)。

    项目网站上解释了完整的设置:http://jproxyloader.sourceforge.net/examples/web-application-on-tomcat.html

    【讨论】:

      【解决方案5】:

      创建一个/bin/setenv.sh(对于WINDOWS \bin\setenv.bat):

      JAVA_OPTS="-Dhttp.proxySet=true -Dhttp.proxyHost=<proxy_hostname> -Dhttp.proxyPort=<port_number> -Dhttp.nonProxyHosts=<domain_one>|<domain two> $JAVA_OPTS"
      

      注意:如果你已经有 setenv.sh/setenv.bat,你可以添加一行上面的命令。 Tomcat 启动脚本在启动一个 tomcat 实例之前会自动运行 setenv 脚本。

      【讨论】:

      • http.proxySet 什么都不做。尝试将其设置为 false 并亲自查看。这是一个都市神话。
      【解决方案6】:

      您也可以在 Tomcat 中实现 HTTP 代理、HTTPS 代理和 HTTP/HTTPS 非代理主机。您需要更新两个文件,即bin/Catalina.shconf/catalina.properties

      【讨论】:

        猜你喜欢
        • 2012-01-15
        • 2020-09-02
        • 1970-01-01
        • 1970-01-01
        • 2012-01-06
        • 1970-01-01
        • 2015-06-05
        • 2013-03-12
        • 1970-01-01
        相关资源
        最近更新 更多