无法在JavaFX WebView中登录Google

我无法在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); } } 

截图在这里

精简版:

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

 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
Access-Control-Allow-Origin不允许使用来源https://accounts.google.com 。

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

我搜索了“同源策略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); } }