gpt4 book ai didi

缓存 java http 代理设置,直到 JVM 重新启动

转载 作者:搜寻专家 更新时间:2023-11-01 01:37:36 25 4
gpt4 key购买 nike

我正在尝试在我的用户界面中更改 JVM 的代理设置(在 Java 1.6.0.23 上运行的 Eclipse 应用程序)

if (isUseProxy()) {
System.setProperty("java.net.useSystemProxies", "true");
System.setProperty("http.proxyHost", getProxyHost());
System.setProperty("http.proxyPort", getProxyPort());
System.setProperty("https.proxyHost", getProxyHost());
System.setProperty("https.proxyPort", getProxyPort());
..........
} else {
System.clearProperty("http.proxyHost");
System.clearProperty("http.proxyPort");
System.clearProperty("https.proxyHost");
System.clearProperty("https.proxyPort");
}

问题是 NEW 代理服务器值在 JVM 重新启动之前不会被使用,它被缓存在 Java 中的某个地方。

Java 版本:

java.runtime.version=1.6.0_26-b03
java.specification.name=Java Platform API Specification
java.specification.vendor=Sun Microsystems Inc.

更新:魔术还在继续……我试着找出问题来弄清楚 Java 如何神奇地与 system.properties 一起工作。看起来 Java 在某些随机情况下会忽略无效的代理服务器设置。此测试失败:

import org.junit.Test;

import java.io.IOException;
import java.net.*;

import static org.junit.Assert.fail;

public class ProxySetTest {

@Test
public void verifyProxyIsNotCachedInJVM() throws IOException {

tryConnectionToGoogleCom();

System.setProperty("http.proxyHost", getInvalidProxyHost());
System.setProperty("http.proxyPort", getInvalidProxyPort()+"");
System.setProperty("https.proxyHost", getInvalidProxyHost());
System.setProperty("https.proxyPort", getInvalidProxyPort()+"");

// Next connection will be through the invalid proxy. must fail?
try {
tryConnectionToGoogleCom();
fail("must have failed with an exception because of invalid proxy setting");
} catch (Exception e) {
System.out.println("received exception: " + e);
}

// clear the proxy setting and try connecting again - must succeed
System.clearProperty("http.proxyHost");
System.clearProperty("http.proxyPort");
System.clearProperty("https.proxyHost");
System.clearProperty("https.proxyPort");

// and without proxy again
tryConnectionToGoogleCom();
}

private void tryConnectionToGoogleCom() throws IOException {
URL url = new URL("http://google.com");
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
connection.connect();
}

private int getInvalidProxyPort() {
return 1234;
}

private String getInvalidProxyHost() {
return "asd";
}
}

最佳答案

所以我遇到了完全相同的问题,并且已经追踪到缓存信息的轴。

它在 org.apache.axis.components.net.TransportClientPropertiesFactory

有问题的方法是:

public static TransportClientProperties create(String protocol)
{
TransportClientProperties tcp =
(TransportClientProperties)cache.get(protocol);

if (tcp == null) {
tcp = (TransportClientProperties)
AxisProperties.newInstance(TransportClientProperties.class,
(Class)defaults.get(protocol));

if (tcp != null) {
cache.put(protocol, tcp);
}
}

return tcp;
}

在第一次调用时,无论当前 JVM 设置是什么代理,都会创建 tcp 对象。在后续调用中,它会拉取缓存版本,因此即使您更改了 JVM 中的代理设置,也没关系。看看我是否能找到清除缓存的方法。

关于缓存 java http 代理设置,直到 JVM 重新启动,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8078590/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com