0

如何通过从 JavaFX WebView 连接到网页来获取 cookie。我想使用此 cookie 以便在 originaol 登录后打开与网站的单独连接。有没有办法做到这一点以及如何做到这一点?

感谢您的时间

4

1 回答 1

2

我有一个本地“login.html”,它对我的​​服务器进行 AJAX 调用以登录。

JavaFX 应用程序代码:

public class Main extends Application {
    public static void main(String[] args) {
        launch(args);
    }

    @Override
    public void start(Stage primaryStage) {
        primaryStage.setTitle("Battleround client");

        URL loginPageUrl = Main.class.getResource("/pages/login.html");

        final WebView webview = new WebView();
        final WebEngine webEngine = webview.getEngine();

        webEngine.setJavaScriptEnabled(true);
        webEngine.load(loginPageUrl.toString());

        /*
         * Alright, this piece of code might be hard to understand. Basically
         * we're adding a JavaScript object that's actually a Java object. So we
         * can call Java methods from JavaScript. And we're adding this
         * javascript object as soon as the page has been fully loaded.
         */
        webEngine.getLoadWorker().stateProperty().addListener(new ChangeListener<Worker.State>() {
            @Override
            public void changed(ObservableValue<? extends State> ov, State t, State t1) {
                if (t1 == Worker.State.SUCCEEDED) {
                    JSObject window = (JSObject) webEngine.executeScript("window");
                    window.setMember("java", new AuthenticationApplication());
                }
            }
    });

    StackPane root = new StackPane();
    root.getChildren().add(webview);
    primaryStage.setScene(new Scene(root, 400, 500));
    primaryStage.show();
}

public class AuthenticationApplication {
    public void start(String JSESSIONID) {
        // From here on I start my game with the JSESSIONID from the login call.
    }
}

我在 login.html 中的 JavaScript 代码:

function login(username, password) {
    var xmlHttp = new XMLHttpRequest();
    if (window.ActiveXObject) {
        xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");
    }

    var url = "http://192.168.2.7:8888/Login";
    var params = "username=" + userName + "&password=" + password;
    xmlHttp.open("POST", url, true);

    // Send the proper header information along with the request
    xmlHttp.setRequestHeader("Content-type",
        "application/x-www-form-urlencoded");
    xmlHttp.setRequestHeader("Content-length", params.length);
    xmlHttp.setRequestHeader("Connection", "close");
    xmlHttp.withCredentials = "true";
    xmlHttp.onreadystatechange = function() {// Call a function when the state changes.
        if (xmlHttp.readyState == 4 && xmlHttp.status == 200) {
            if(xmlHttp.responseText == "login.successful") {
                document.getElementById("loginForm").innerHTML = getResources("login.successful");
                var setCookieHeader = xmlHttp.getResponseHeader('Set-Cookie');
                java.start(setCookieHeader.split(";")[0].split("=")[1]); // Obtain the JSESSIONID, and send it to the java code. Warning: this code will mess up if there's other cookies.
            } else {
                document.getElementById("validationMessage").innerHTML = getResources(xmlHttp.responseText);
            }
        }
    };
    xmlHttp.send(params);
}

function getResources(key) {
    var resources = {};

    resources["login.already.logged.in"] = "You are already logged in! Log out first if you want to try again.";
    resources["login.error"] = "The login failed because an error occurred, Sorry!";
    resources["login.failed"] = "User name and password do not match.";
    resources["login.successful"] = "Login succeeded.";

    return resources[key];
}
于 2013-11-08T14:03:40.597 回答