无法在JavaFX WebView中登录Google

时间:2017-07-04 11:51:26

标签: java javafx webview webengine

我无法在JavaFX WebView中登录Google。点击“下一步”后页面无法加载。按钮。

不同网站上的其他登录工作正常。

以下是您可以运行的示例:

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);
    }
}

Screenshot here

1 个答案:

答案 0 :(得分:9)

简短版本:

在加载页面之前,将以下行添加到main方法:

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

长版:

我的第一直觉是JavaScript没有工作,但我测试了虚拟电子邮件并正确地得到了错误:

  

无法找到您的Google帐户

所以看起来有些JavaScript正在运行,但不是让用户能够继续输入密码的部分。我添加了以下监听器来监听控制台错误which I found here

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不被允许   访问控制允许来源。

这是一项名为Same-Origin Policy的安全功能。它旨在阻止页面从潜在的恶意第三方网站加载脚本。

我搜索了#34;同源策略JavaFX"和found the following question这将解决您的问题。

修复和附加日志记录的完整应用程序是:

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);
    }
}