Модульная Java 13 / JavaFx WebWiew не отображается при jlinked - PullRequest
1 голос
/ 05 февраля 2020

У меня проблема с отображением веб-страницы во встроенном окне, но только при создании автономного jlinked-пакета и только для определенных сайтов https.

Я следовал инструкциям на https://openjfx.io/openjfx-docs/#install -javafx для создания простого модульного приложения, и это прекрасно работает при запуске из командной строки с

java --module-path "%PATH_TO_FX%;mods" -m uk.co.comsci.testproj/uk.co.comsci.testproj.Launcher

, но после связывания с командой

jlink --module-path "%PATH_TO_FX_MODS%;mods" --add-modules uk.co.comsci.testproj --output launch

и запуска с

launch\bin\java.exe -m uk.co.comsci.testproj/uk.co.comsci.testproj.Launcher

открывается сцена javaFx, но только пустой экран ... и мне приходится использовать диспетчер задач для завершения работы приложения.

Если я изменю URL-адрес на другие https-сайты, он будет отображаться нормально.

Полагаю, что где-то все зависит от настроек и политик безопасности, но я не знаю, с чего начать.

Я попытался выполнить мониторинг с помощью WireShark, и это показывает, что при запуске из java и он работает, он делает некоторые вещи TLSv1.3, чтобы установить sh соединение. При запуске в виде jlinked пакета он выполняет только TLSv1.2. Может быть, ключ?

Вот мой SSCE:

module-info. java

module uk.co.comsci.testproj {
    requires javafx.web;
    requires javafx.controls;
    requires javafx.media;
    requires javafx.graphics;
    requires javafx.base;
    exports uk.co.comsci.testproj;
}

Launcher. java

package uk.co.comsci.testproj;

public class Launcher {
    public static void main(String[] args) {
        try {
            MainApp.main(args);
        } catch (Exception ex) {
            System.err.println("Exception!!! " + ex);
        }
    }
}

MainApp. java

package uk.co.comsci.testproj;

import javafx.application.Application;
import javafx.geometry.Pos;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.layout.HBox;
import javafx.scene.layout.Priority;
import javafx.scene.layout.VBox;
import javafx.scene.web.WebEngine;
import javafx.scene.web.WebView;
import javafx.stage.Modality;
import javafx.stage.Stage;
import javafx.stage.StageStyle;

public class MainApp extends Application {

    private Stage mainStage;

    public static void main(String[] args) throws Exception {
        launch(args);
    }

    @Override
    public void start(final Stage initStage) throws Exception {

        mainStage = new Stage(StageStyle.DECORATED);

        mainStage.setTitle("Test Project");

        WebView browser = new WebView();
        WebEngine webEngine = browser.getEngine();

//        webEngine.load("https://app.comsci.co.uk"); // url);
        String uri = "https://test-api.service.hmrc.gov.uk/oauth/authorize"
                + "?response_type=code&redirect_uri=http%3A%2F%2Flocalhost%3A8084%2Fredirect"
                + "&state=lFuLG42uri_aAQ_bDBa9TZGGYD0BDKtFRv8xEaKbeQo"
                + "&client_id=tASN6IpBPt5OcIHlWzkaLXTAyMEa&scope=read%3Avat+write%3Avat";
        webEngine.load(uri);

        Button closeButt = new Button("Cancel");
        closeButt.setOnMouseClicked(event -> {
            mainStage.close();
        });
        HBox closeButBar = new HBox(closeButt);
        closeButBar.setAlignment(Pos.BASELINE_RIGHT);

        VBox vlo = new VBox(browser, closeButBar);
        vlo.setFillWidth(true);
        vlo.setSpacing(10.0);
        VBox.setVgrow(browser, Priority.ALWAYS);

        Scene scene2 = new Scene(vlo, 800, 800);
        mainStage.setScene(scene2);
        mainStage.initModality(Modality.APPLICATION_MODAL);
        mainStage.setTitle("Test connection");
        mainStage.showAndWait();
    }

}

Любая помощь высоко ценится.

1 Ответ

1 голос
/ 06 февраля 2020

OK. Наконец выследил это. Так что в случае, если у кого-то есть такая же проблема:

Ничего общего с JavaFx или Webview, это было сбой рукопожатия TLS.

Замена веб-просмотра с http-клиентом get

            String uri = "https://test-api.service.hmrc.gov.uk/oauth/authorize"
                    + "?response_type=code&redirect_uri=http%3A%2F%2Flocalhost%3A8084%2Fredirect"
                    + "&state=lFuLG42uri_aAQ_bDBa9TZGGYD0BDKtFRv8xEaKbeQo"
                    + "&client_id=tASN6IpBPt5OcIHlWzkaLXTAyMEa&scope=read%3Avat+write%3Avat";

            var client = HttpClient.newHttpClient();
            var request = HttpRequest.newBuilder()
                    .GET()
                    .uri(URI.create(uri))
                    .timeout(Duration.ofSeconds(15))
                    .build();

            try {
                HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
                System.out.println("REsponse  " + response.body());
            } catch (IOException | InterruptedException e) {
                e.printStackTrace();
            }

и выполнение с '-Djavax. net .debug = ssl: handshake: verbose' показало, что рукопожатие не удалось. запуск встроенного keytool -showinfo -tls и сравнение его с выходными данными системного keytool показали, что шифры TLS_ECDHE _... там, где они не поддерживаются в выводе с ссылками

Немного поиска и справки отсюда https://www.gubatron.com/blog/2019/04/25/solving-received-fatal-alert-handshake_failure-error-when-performing-https-connections-on-a-custom-made-jre-with-jlink/ показал, что все, что мне нужно было сделать, это добавить

requires jdk.crypto.cryptoki;

к моей информации о модуле. java: -)

...