【问题标题】:HTTP Proxy Setup For Java JVMJava JVM 的 HTTP 代理设置
【发布时间】:2015-02-25 21:55:43
【问题描述】:

为 Java JVM 6.x 设置 HTTP 代理对我不起作用;我希望有人能发现我缺少的东西。

我在 JBOSS 5.1.2 上部署了一个 Java 应用程序,它多次调用外部 Web 服务。我希望能够使用代理拦截这些调用:Fiddler 版本 4.4.8.0。

在执行SO search 之后,我在启动时将以下标志添加到我的 JBOSS VM 参数中:

-DproxySet=true -Dhttp.proxyHost=localhost -Dhttp.proxyPort=8888 -Dhttps.proxyHost=localhost -Dhttps.proxyPort=8888

我在 IntelliJ 14 中运行 JBOSS。

如果我启动 JBOSS、Fiddler 并在 Chrome 中打开 UI,我可以看到从浏览器到应用程序的流量。我没有看到任何从 JBOSS 到外部服务的调用被拦截。我以为除了浏览器对 JBOSS 的调用之外,我还会看到从 JBOSS 对外部服务的所有调用。

更新:

我尝试根据this SO answer 将这些添加到 properties-service.xml - 不高兴。

我正在运行 Spring 3,使用 Apache HttpClient 作为我的 Web 服务客户端。我将研究为它配置代理。

【问题讨论】:

  • 如果 jboss 中的代码建立自己的 Socket 连接并选择忽略代理配置,则不会被代理。这些参数仅影响其他各种库中的 HttpURLConnection 和“同意的成年人”。
  • 我会回答这个问题,但我怀疑你不知道,所以我猜我错过了什么。
  • 你给了我太多的信任。我不知道。也许这是我需要进一步研究的事情。
  • 感谢您一贯的明智建议。知道不该看的地方是有帮助的。我发现有一个 JBOSS 配置可以解决问题。立即尝试:stackoverflow.com/questions/2183215/…
  • 请参阅下面的答案。去 Spring 配置就行了。

标签: java proxy jvm fiddler intellij-14


【解决方案1】:

感谢 bmargulies 和其他查看此内容的人。我有一个解决方案,希望对其他人有所帮助。

在我的 JVM 启动选项中添加 -Dhttp.proxyHost 参数没有任何作用。

在我的部署properties-services.xml 中将这些相同的参数添加到 JBOSS 5.1.2 配置中没有任何作用。

我相信使用 Spring 3.x 是解释这种行为的一个因素。我不得不告诉 Spring Web 服务客户端使用代理。

我添加了一些 Spring bean 以连接到 Fiddler 代理 HttpClient 并将其注入 Web 服务客户端,替换非代理版本。

我第一次尝试它失败了。我花了一段时间才弄清楚 Apache Commons HttpConfiguration 类没有遵循 Java bean 标准,所以 Spring 在尝试连接它时崩溃了。我不得不使用 Spring MethodInvokingFactoryBean 来解决它。

这里是相关的 Spring 配置 XML:

<!-- New beans for Fiddler proxy -->
<bean id="fiddlerProxyHost" class="org.apache.commons.httpclient.ProxyHost">
    <constructor-arg name="hostname" value="localhost"/>
    <constructor-arg name="port" value="8888"/>
</bean>

<bean id="fiddlerProxyHostConfiguration" class="org.apache.commons.httpclient.HostConfiguration"/>

<bean id="fiddlerProxyHostSetter" class="org.springframework.beans.factory.config.MethodInvokingFactoryBean">
    <property name="targetObject" ref="fiddlerProxyHostConfiguration"/>
    <property name="targetMethod" value="setProxyHost"/>
    <property name="arguments" ref="fiddlerProxyHost"/>
</bean>

<bean id="fiddlerProxyClient" class="org.apache.commons.httpclient.HttpClient">
    <property name="hostConfiguration" ref="fiddlerProxyHostConfiguration"/>
</bean>

现在我可以在 Fiddler 中看到应用程序对 Web 服务的调用。快乐!

【讨论】:

    【解决方案2】:

    这些参数首先由HttpURLConnection 读取。当然,它们是特定于 HTTP 的,因此任何其他连接到外部世界的方式都必然会忽略它们。

    代码有很多充分的理由避免HttpURLConnection 并通过普通的旧套接字打开 TCP 连接,即使该代码计划使用 HTTP。 HttpURLConnection 有几个“浏览器仿真功能”会妨碍您。例如,CORS 被破坏并拒绝一些合法的 HTTP 动词。

    执行此操作并反过来执行 HTTP 的代码可能会选择尊重这些参数,也可能不会。例如,我有理由确定 Apache Commons HTTP 库为调用者提供了选择。

    如果您将 JBoss 放入调试器并中断套接字连接原语,我想您会很快发现在这方面发生了什么。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-09-12
      • 2016-08-24
      • 1970-01-01
      • 2019-01-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多