2017-07-04 58 views
7

Nie mogę zalogować się do Google w JavaFX WebView. Strona nie ładuje się po kliknięciu przycisku "Dalej".Nie można zalogować się do Google w JavaFX WebView

Inne logowania na różnych stronach internetowych działają dobrze.

Oto przykład można uruchomić:

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

Odpowiedz

7

Short Version:

Dodaj następujący wiersz do głównej metody, przed załadowaniem strony:

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

Długa wersja:

Moim pierwszym odruchem było to, że JavaScript nie działa, ale ja testowałem obojętne maile i prawidłowo dostaje błąd:

Couldn't find your Google Account

więc wydawało się jakimś JavaScript działa, ale nie część, która umożliwiła użytkownikowi dalsze wprowadzanie hasła. Dodałem następujące słuchacza do nasłuchiwania konsoli błędów, which I found here:

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

Spowodowało następującego błędu:

Console: [null:0] XMLHttpRequest cannot load https://ssl.gstatic.com/accounts/static/_/js/blahblahblah
Origin https://accounts.google.com is not allowed by Access-Control-Allow-Origin.

Jest to zabezpieczenie zwane Same-Origin Policy. Ma on na celu powstrzymanie stron przed ładowaniem skryptów z potencjalnie złośliwych witryn stron trzecich.

Szukałem "Zasady Same Origin Policy JavaFX" i found the following question, które rozwiążą Twój problem.

Pełne zastosowanie zarówno poprawki i dodatkowego logowania to:

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