Не удается войти в Google в JavaFX WebView

Я не могу войти в Google в JavaFX WebView. Страница не загружается, когда я нажимаю кнопку "Далее".

другие логины на разных веб-сайтах работают нормально.

вот пример, который вы можете запустить:

import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.layout.StackPane;
import javafx.scene.web.WebEngine;
import javafx.scene.web.WebView;
import javafx.stage.Stage;

public class App extends Application
{
    @Override
    public void start(Stage primaryStage) throws Exception
    {
        WebView browser = new WebView();

        WebEngine webEngine = browser.getEngine();

        webEngine.load("https://calendar.google.com");

        StackPane root = new StackPane();
        root.getChildren().add(browser);

        primaryStage.setScene(new Scene(root, 600, 600));
        primaryStage.show();
    }

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

скриншот сюда

1 ответов


Короткая Версия:

перед загрузкой страницы добавьте следующую строку в основной метод:

System.setProperty("sun.net.http.allowRestrictedHeaders", "true");

Версия:

мой первый инстинкт был в том, что JavaScript не работает, но я проверил фиктивные письма и правильно получил ошибку:

не удалось найти свой аккаунт Google

поэтому казалось, что какой-то JavaScript работает, но не та часть, которая позволила пользователю продолжайте вводить пароль. Я добавил следующий прослушиватель для прослушивания ошибок консоли,что я нашел здесь:

com.sun.javafx.webkit.WebConsoleListener.setDefaultListener(
    (webView, message, lineNumber, sourceId) ->
        System.out.println("Console: [" + sourceId + ":" + lineNumber + "] " + message)
);

это привело к следующей ошибке:

консоль: [null: 0] XMLHttpRequest не удается загрузить https://ssl.gstatic.com/accounts/static/_/js/blahblahblah
Происхождение https://accounts.google.com не допускается Access-Control-Allow-Origin.

Это функция безопасности под названием Политика Того Же Происхождения. Он предназначен для того, чтобы страницы не могли загружать скрипты с потенциально вредоносных сторонних веб-сайтов.

Я искал "ту же политику происхождения JavaFX" и нашел следующий вопрос что решит вашу проблему.

полное приложение с исправлением и дополнительным журналированием:

public class CalendarController extends Application
{
    @Override
    public void start(Stage primaryStage) throws Exception
    {
        WebView browser = new WebView();

        WebEngine webEngine = browser.getEngine();

        com.sun.javafx.webkit.WebConsoleListener.setDefaultListener(
            (webView, message, lineNumber, sourceId)-> System.out.println("Console: [" + sourceId + ":" + lineNumber + "] " + message)
        );

        webEngine.load("http://calendar.google.com");

        StackPane root = new StackPane();
        root.getChildren().add(browser);

        primaryStage.setScene(new Scene(root, 600, 600));
        primaryStage.show();
    }

    public static void main(String[] args)
    {
        System.setProperty("sun.net.http.allowRestrictedHeaders", "true");
        launch(args);
    }
}