无法在 JavaFX WebView 中登录 Google

Posted

技术标签:

【中文标题】无法在 JavaFX WebView 中登录 Google【英文标题】:Cannot sign in to Google in JavaFX WebView 【发布时间】:2017-12-07 21:14:14 【问题描述】:

我。当我点击“下一步”按钮时,页面没有加载。

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

这是一个您可以运行的示例:

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】:

短版:

在加载页面之前,将以下行添加到您的 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 的安全功能。它旨在阻止页面加载来自潜在恶意第三方网站的脚本。

我搜索了“Same Origin Policy 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);
    

【讨论】:

以上是关于无法在 JavaFX WebView 中登录 Google的主要内容,如果未能解决你的问题,请参考以下文章

JavaFx Webview JDK 8 无法加载自签名证书

JavaFX WebView 中的 Html/Javascript 调试

Discord OAuth2 重定向 URL 无法使用 JavaFX WebView JDK12 显示

JAVAFX / WebView / WebEngine FireBugLite还是其他一些调试器?

JavaFX WebView:透明WebView保持绘制旧内容

JavaFX 中 WebView 的性能