Здравствуйте! У меня проблемы с настройками прокси в веб-приложении. Я обычно работал, делая что-то вроде этого:
String proxyAddress = "myproxy.internal.customer.com";
String proxyPort= "80";
System.setProperty("http.proxySet", "true");
System.setProperty("http.proxyHost", proxyAddress);
System.setProperty("http.proxyPort", proxyPort);
К сожалению, эти настройки "classi c" не могут быть использованы в моем приложении, потому что создают конфликты с другим приложением. Поэтому я выбрал решение, расширяющее класс ProxySelector с помощью пользовательского класса, например:
import java.io.IOException;
import java.net.InetSocketAddress;
import java.net.Proxy;
import java.net.ProxySelector;
import java.net.SocketAddress;
import java.net.URI;
import java.util.ArrayList;
import java.util.List;
import eu.mycustomer.PropertiesLoader;
public class CustomProxySelector extends ProxySelector {
private final ProxySelector def;
private List<Proxy> proxyList = new ArrayList<>();
public CustomProxySelector(String proxyHost, String proxyPort) {
this.def = ProxySelector.getDefault();
proxyList.add(new Proxy(Proxy.Type.HTTP, new InetSocketAddress(proxyHost, (null == proxyPort) ? 80 : Integer.valueOf(proxyPort))));
ProxySelector.setDefault(this);
}
@Override
public List<Proxy> select(URI uri) {
if (uri == null) {
throw new IllegalArgumentException("URI can't be null.");
}
String[] proxyHttpsForExternal = PropertiesLoader.getInstance().getProperty("proxy.https.for.external").split(";");
for(String s : proxyHttpsForExternal) {
if (uri.getHost().contains(s)) {
return proxyList;
}
}
return def.select(uri);
}
@Override
public void connectFailed(URI uri, SocketAddress sa, IOException ioe) {
if (uri == null || sa == null || ioe == null) {
throw new IllegalArgumentException("Arguments can't be null.");
}
def.connectFailed(uri, sa, ioe);
}
}
, и затем настройку перед вызовом веб-службы с помощью:
ProxySelector.setDefault(new CustomProxySelector(proxyAddress, proxyPort));
Но я получил следующее исключение в классе IBM SocksSocketImpl :
java.net.SocketException: Unknown proxy type : HTTP
Декомпилируя класс, я увидел это:
.....
.....
Proxy p = null;
IOException savedExc = null;
java.util.Iterator<Proxy> iProxy = null;
iProxy = sel.select(uri).iterator();
if (iProxy == null || !(iProxy.hasNext())) {
super.connect(epoint, timeout);
return;
}
while (iProxy.hasNext()) {
p = iProxy.next();
if (p == null || p == Proxy.NO_PROXY) {
super.connect(epoint, timeout);
return;
}
if (p.type() != Proxy.Type.SOCKS)
throw new SocketException("Unknown proxy type : " + p.type());
.....
.....
Я использую Java 1.5, Axis 1.3 и приложение работает под websphere 6.1 (да, я знаю, что оно старое :)). Любая подсказка / предложение будет очень признателен. Альтернативные решения приветствуются, но они должны исключать подход System.setProperty. Спасибо!