在我的Java FX应用程序中,我应该加载一个简单的HTML页面,其中包含一个显示外部网站的iframe。我知道我可以使用webEngine.load()
来加载网站,但作为一项要求,我必须以这种方式实现它(我试图将Duo Security Web SDK合并到我们的Java应用程序中)。
在Windows上,一切正常。但是某些网站没有在Linux上加载(Debian,Fedora)。我可以显示gmail(https),espn.com或en.wikipedia.org等网站。然而谷歌和雅虎不会加载。我不认为它是https或flash问题。请参阅下面的代码。
爪哇:
webEngine.getLoadWorker().stateProperty().addListener(
new javafx.beans.value.ChangeListener<State>() {
@Override
public void changed(ObservableValue ov, State oldState, State newState) {
if (newState == State.SUCCEEDED) {
webEngine.executeScript(
"window.duoHost = '"+duoHost+"';"
+ "window.duoSigRequest = '"+duoSigRequest+"';"
+ "loadDuoOptions();");
JSObject jsobj = (JSObject) webEngine.executeScript("window");
jsobj.setMember("java", new Bridge());
System.out.println("Set up done");
}
}
});
HTML:
<head>
<title>Designer Login with Duo </title>
<script src="Duo-Web-v1.bundled.js"></script>
<script>
function loadDuoOptions(){
Duo.init({
'host' : window.duoHost,
'sig_request' : window.duoSigRequest
});
Duo.ready();
}
window.processDuoResponse = function(data){
duoResponse = data;
loginHandler.verifyDuoResponse(duoResponse);
}
</script>
</head>
<body>
<iframe id="duo_iframe" width="500" height="500" frameborder="0"></iframe>
</html>
答案 0 :(得分:0)
这修复了HTTPS:
private void installCertificateVerificationBypassTools() {
this.installCustomTrustManager();
this.installCustomHostNameverifier();
}
private void installCustomTrustManager() {
System.out.println("Installing custom trust manager");
try {
TrustManager[] nonDiscriminantTrustManager = new TrustManager[]{new X509TrustManager() {
@Override
public java.security.cert.X509Certificate[] getAcceptedIssuers() {
return null;
}
@Override
public void checkClientTrusted(X509Certificate[] certs, String authType) {
// ignore client trust check
}
@Override
public void checkServerTrusted(X509Certificate[] certs, String authType) {
// ignore server trust check
}
}};
final SSLContext ret = SSLContext.getInstance("SSL");
ret.init(null, nonDiscriminantTrustManager, new SecureRandom());
HttpsURLConnection.setDefaultSSLSocketFactory(ret.getSocketFactory());
} catch (KeyManagementException | NoSuchAlgorithmException ex) {
}
}
private void installCustomHostNameverifier() {
System.out.println("Installing custom hostname verifier");
HostnameVerifier hv = new HostnameVerifier() {
@Override
public boolean verify(String string, SSLSession ssls) {
System.out.println("Verifying connection...");
showSSLSessionDetails(ssls);
if (ssls.getProtocol().contains("https")) {
System.out.println("https session allowed.");
}
return true;
}
};
HttpsURLConnection.setDefaultHostnameVerifier(hv);
}
在 mySplass扩展应用程序类的 public void start(Stage mainStage)方法中使用 installCertificateVerificationBypassTools()。
请注意,这会接受所有传入的证书。