Мне нужно вызвать WS, который требует пользовательской аутентификации клиента.Эта аутентификация выполняется программой, запущенной на клиенте и прослушивающей http://127.0.0.1:80.. Поэтому я добавляю ProxySelector при запуске следующим образом:
final ProxySelector ps = new ProxySelector() {
@Override
public void connectFailed(URI uri, SocketAddress sa, IOException ioe) {
ioe.printStackTrace();
}
@Override
public List<Proxy> select(URI uri) {
final List<Proxy> proxy = new ArrayList<Proxy>();
final SocketAddress adr = new InetSocketAddress("127.0.0.1", 80);
final Proxy p = new Proxy(Proxy.Type.HTTP, adr);
proxy.add(p);
return proxy;
};
ProxySelector.setDefault(ps);
Это используется для нормальной работы, но после некоторого рефакторинга(не относится к вызовам WS), вместо ввода http://my.server.com в качестве ввода URI, у меня есть socket: //my.server.com, и происходит сбой с «Неизвестный тип прокси: HTTP», что кажется вполне нормальным для схемы SOCKET ...
Разница между моим старым приложением и новым заключается в том, что поведение во время HttpUrlConnection.plainConnect () не было таким же.Действительно, рабочая версия вызывает мой ProxySelector с правильным URI (строка 922 http://www.docjar.com/html/api/sun/net/www/protocol/http/HttpURLConnection.java.html),, тогда как новая версия переходит на строку 959 и начинает создавать новое базовое соединение, которое заканчивается схемой socket: //.
Таким образом, разница заключается в следующих строках:
ProxySelector sel =
java.security.AccessController.doPrivileged(
new java.security.PrivilegedAction<ProxySelector>() {
public ProxySelector run() {
return ProxySelector.getDefault();
}
});
Это раньше возвращало мой ProxySelector как "sel", но теперь возвращает ноль.
Может кто-нибудь объяснить мне, что именно означаетэти строки, и почему результат не такой, как в моем старом приложении?