0

我有一个负载服务器应用程序,它在两个应用程序 App1 和 App2 之间切换。每个 App 都有自己的 IFrame 与银行通信,但是当银行返回数据时,加载服务器无法区分是哪个应用程序。我对此进行了调查,然后我发现这是代理问题。

结果,我试图强制应用程序使用proxyHost&proxyport但它不起作用,然后我强制Jboss使用特定的proxyHost&proxyport但它也不起作用。它使用盒子上的默认代理,它不关心我的配置。

proxyHost在JbossproxyPort启动脚本bin\run.bat-Dhttp.proxyHost=XX.XX.XX.XX -Dhttp.proxyPort=8080

我在 google 和 stackoverflow 中搜索并尝试了不同的想法,但没有奏效。有人可以解释一下吗?

4

2 回答 2

0

您能否尝试使用以下 JVM 参数运行您的应用程序:-Dsun.net.inetaddr.ttl=0 -Dnetworkaddress.cache.ttl=0

DNS 设置在请求成功后被缓存,这些参数将禁用缓存。

于 2013-03-19T21:31:17.810 回答
0

您可以强制应用程序忽略 proxyHost 的任何 VM 参数,而只使用运行它的机器的默认代理。您可以编写一个小型 java 程序,它只打印默认代理并在特定框上运行它(例如这个):

import java.net.InetSocketAddress;
import java.net.ProxySelector;
import java.net.URISyntaxException;
import java.util.Iterator;
import java.util.List;

import java.net.URI;

public class PrintDefaultProxy {
    public static void main(String[] args) {

        // If you clear these 2 properties then set java.net.useSystemProxies to true, it 
        // will use the default System Proxy and ignore any settings given to the VM
        // e.g. http.proxyHost & http.proxyPort
        System.setProperty("http.proxyHost", "");
        System.setProperty("http.proxyPort", "");

        System.setProperty("java.net.useSystemProxies", "true");
        System.out.println("detecting proxies");
        List l = null;
        try {
            String url = "http://google.com.au/";
            l = ProxySelector.getDefault().select(new URI(url));
        } 
        catch (URISyntaxException e) {
            e.printStackTrace();
        }
        if (l != null) {
            for (Iterator iter = l.iterator(); iter.hasNext();) {
                java.net.Proxy proxy = (java.net.Proxy) iter.next();
                System.out.println("proxy Type : " + proxy.type());

                InetSocketAddress addr = (InetSocketAddress) proxy.address();

                if (addr == null) {
                    System.out.println("No Proxy");
                } else {
                    System.out.println("proxy hostname : " + addr.getHostName());
                    System.setProperty("http.proxyHost", addr.getHostName());
                    System.out.println("proxy port : " + addr.getPort());
                    System.setProperty("http.proxyPort", Integer.toString(addr.getPort()));
                }
            }
        }
    }
}

基本上在代码中,如果您清除 http.proxyHost 和 http.proxyPort 然后将 java.net.useSystemProxies 设置为 true,它将使用系统默认代理(如果有)并忽略任何 VM 参数。

System.setProperty("http.proxyHost", "");
System.setProperty("http.proxyPort", "");

System.setProperty("java.net.useSystemProxies", "true");
System.out.println("detecting proxies");

然后你在你的盒子上运行它并传递一些虚假的代理地址:

C:\t>"C:\Program Files\Java\jdk1.6.0_19\bin\java.exe" -Dhttp.proxyHost=99.0.0.99.9 -Dhttp.proxyPort=8080  PrintDefaultProxy
detecting proxies
proxy Type : DIRECT
No Proxy

请注意,如果您不清除这两个属性,它将使用您传递给 JVM 的参数——但据我了解,这不是您的应用程序似乎在做的事情。这是应用程序应该“正常工作”而无需专门设置 proxyHost 的一种方式——这很可能是它忽略您在 JVM/Jboss 级别提供的任何设置的原因。

当行为与您尝试在 Jboss 中更改这些设置时所经历的一致时,这意味着您无法在应用程序或 Jboss 级别将其配置为使用 proxyHost,并且很可能需要在网络级别完成。

于 2013-03-20T06:08:45.370 回答