JavaFX WebView не загружает страницу
Я пытаюсь открыть "engine.load (" https://login.microsoftonline.com/");" в JavaFX WebView.
При использовании jdk1.8.0_161 страница загружается. При использовании jdk1.8.0_181 страница не загружается. Он отображает пустое окно и не возвращает никакой ошибки: engine.getLoadWorker(). ExceptionProperty() имеет значение null.
Есть ли у вас какие-либо идеи, что могло бы измениться в новых версиях обновлений Java? Я протестировал на Java 10 последний выпуск и страница также не загружается. Этот код работает с JDK8.161 и JDK9.0.4, но не работает с JDK8.181 и JDK10.0.2
Вот исходный код примера приложения, которое я создал:
import javafx.application.Platform;
import javafx.beans.value.ChangeListener;
import javafx.beans.value.ObservableValue;
import javafx.concurrent.Worker.State;
import javafx.embed.swing.JFXPanel;
import javafx.event.EventHandler;
import javafx.scene.Scene;
import javafx.scene.web.WebEngine;
import javafx.scene.web.WebErrorEvent;
import javafx.scene.web.WebEvent;
import javafx.scene.web.WebView;
import javafx.util.Callback;
import java.security.KeyManagementException;
import java.security.NoSuchAlgorithmException;
import java.security.cert.CertificateException;
import java.security.cert.X509Certificate;
import javax.net.ssl.HostnameVerifier;
import javax.net.ssl.HttpsURLConnection;
import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLSession;
import javax.net.ssl.TrustManager;
import javax.net.ssl.X509TrustManager;
import javax.swing.*;
import org.w3c.dom.Document;
public class LoginApplicationWindow {
public static void main(String args[]) {
final JFrame frame = new JFrame();
frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
frame.setSize(620, 440);
final JFXPanel fxpanel = new JFXPanel();
frame.add(fxpanel);
Platform.runLater(new Runnable() {
@Override
public void run() {
WebEngine engine;
WebView wv = new WebView();
engine = wv.getEngine();
engine.setJavaScriptEnabled(true);
// Create a trust manager that does not validate certificate chains
TrustManager[] trustAllCerts = new TrustManager[] {new X509TrustManager() {
@Override
public X509Certificate[] getAcceptedIssuers() {
// TODO Auto-generated method stub
return null;
}
@Override
public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException {
// TODO Auto-generated method stub
}
@Override
public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException {
// TODO Auto-generated method stub
}
}};
// Install the all-trusting trust manager
SSLContext sc;
try {
sc = SSLContext.getInstance("SSL");
sc.init(null, trustAllCerts, new java.security.SecureRandom());
HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());
} catch (NoSuchAlgorithmException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (KeyManagementException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
// Create all-trusting host name verifier
HostnameVerifier allHostsValid = new HostnameVerifier() {
@Override
public boolean verify(String hostname, SSLSession session) {
// TODO Auto-generated method stub
return true;
}
};
// Install the all-trusting host verifier
HttpsURLConnection.setDefaultHostnameVerifier(allHostsValid);
engine.getLoadWorker().stateProperty().addListener(new ChangeListener<State>() {
public void changed(ObservableValue ov, State oldState, State newState) {
if (newState == State.SUCCEEDED) {
Document doc = engine.getDocument();
// operations on dom occur here.
System.out.println(engine.getLoadWorker().exceptionProperty());
System.out.print("load finished " + doc.getBaseURI());
}
}
});
engine.setOnAlert(new EventHandler<WebEvent<String>>() {
@Override
public void handle(WebEvent<String> event) {
System.out.print("setOnAlert " + event.getData());
}
});
engine.setOnError(new EventHandler<WebErrorEvent>() {
@Override
public void handle(WebErrorEvent event) {
System.out.print("onError " + event.getMessage());
}
});
engine.setConfirmHandler(new Callback<String, Boolean>() {
@Override
public Boolean call(String param) {
// TODO Auto-generated method stub
System.out.print("setConfirmHandler " + param);
return null;
}
});
fxpanel.setScene(new Scene(wv));
engine.load("https://login.microsoftonline.com");
//engine.load("https://facebook.com");
}
});
frame.setVisible(true);
}
}
1 ответ
Оказалось, что ЛЮБАЯ проблема с сетью (DNS/ соединение) может вызвать ошибку, и загрузка не вызовет никакого надлежащего исключения. Хорошей новостью является то, что если вы замените вызов.load (url), по крайней мере, вы увидите проблемы в журнале.
Под заменой я подразумеваю, что загружаю сайт отдельно в строку
private static String getData(String address) throws Exception {
URL page = new URL(address);
StringBuffer text = new StringBuffer();
HttpURLConnection conn = (HttpURLConnection) page.openConnection();
conn.connect();
try (InputStreamReader in = new InputStreamReader(
(InputStream) conn.getContent())) {
BufferedReader buff = new BufferedReader(in);
String line;
do {
line = buff.readLine();
text.append(line + "\n");
} while (line != null);
return text.toString();
} finally {
conn.disconnect();
}
}
И заменить.load:
//engine.load("https://login.microsoftonline.com");
engine.loadContent(getData("https://login.microsoftonline.com"));
Конечно, исключение должно быть перехвачено и зарегистрировано должным образом. (Самое смешное, что ссылочные ресурсы (изображения /js/css и другие файлы) также будут загружены таким же образом.)