Есть ли способ получить ответ с веб-сайта, отображаемого на JEditorPane?

Я хочу выполнить аутентификацию из автономного приложения. Поэтому я отображаю страницу входа стажера моей компании на JEditorPane. Сначала вы увидите окно входа в систему, как обычно. Вы вводите имя пользователя и пароль. В случае успешного входа страница изменится на «Войти успешно». Как мне отличить эти окна и получить URL-адрес второго окна?

JEditorPane loginPane = new JEditorPane();
loginPane.setEditable(false);

try {
    loginPane.setPage("http://mypage.blalala.com");
} catch (IOException e) {
    loginPane.setContentType("text/html");
    loginPane.setText("<html>Could not load</html>");
}

JScrollPane scrollPane = new JScrollPane(loginPane);
JFrame f = new JFrame("Test HTML");
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.getContentPane().add(scrollPane);
f.setPreferredSize(new Dimension(800, 600));
f.setVisible(true);

person Community    schedule 22.08.2019    source источник
comment
Возможно, ответ here даст вам представление о том, как это сделать.   -  person second    schedule 22.08.2019
comment
@ Во-вторых, нет, это не ответ, он только возвращает компоненты на этом сайте. я хочу получить ответ от веб-сайта в случае успешного входа в систему   -  person    schedule 22.08.2019
comment
Я не уверен, что вы пытаетесь сказать. Если вы используете HttpClient, вы можете отправить любой тип запроса на свой сервер, и вы должны получить от него правильный ответ. Возможно, вы захотите отредактировать свой вопрос и описать, какой ответ вы ожидаете от сервера.   -  person second    schedule 22.08.2019
comment
Я думаю, что ответ от @vincenzopalazzo должен показать вам общий вариант использования, однако он также не сработал для моей пробной страницы. Вероятно, он нуждается в некоторых корректировках. Теоретически, если вы введете данные правильно, в HyperLinkListener вы сможете сгенерировать правильный запрос к вашему серверу, на который он должен ответить новой html-страницей.   -  person second    schedule 22.08.2019
comment
Если вам все еще нужно внутреннее различие для вашего приложения, вам, вероятно, придется проанализировать URL-адрес/или контент, чтобы увидеть, на какой странице вы находитесь (что снова приведет к исходно связанному ответу).   -  person second    schedule 22.08.2019


Ответы (1)


Я думаю, вам нужен слушатель, это мой пример приложения

/*
 * This code is under license Creative Commons Attribution-ShareAlike 1.0
 * <a href="https://creativecommons.org/licenses/by-sa/1.0/legalcode"></a>
 */
package javaapplication5;

import java.awt.Dimension;
import java.io.IOException;
import javax.swing.JEditorPane;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.SwingUtilities;
import javax.swing.event.HyperlinkEvent;
import javax.swing.event.HyperlinkListener;
import javax.swing.text.html.HTMLDocument;
import javax.swing.text.html.HTMLFrameHyperlinkEvent;

public class DemoAppWebSwing extends JFrame {

    private static final DemoAppWebSwing SINGLETON = new DemoAppWebSwing();

    public void init() {
        JEditorPane loginPane = new JEditorPane();
        loginPane.setEditable(false);

        try {
            loginPane.setPage("https://github.com/vincenzopalazzo");
            loginPane.addHyperlinkListener(new HyperlinkListener() {
                public void hyperlinkUpdate(HyperlinkEvent e) {
                    if (e.getEventType() == HyperlinkEvent.EventType.ACTIVATED) {
                        JEditorPane pane = (JEditorPane) e.getSource();
                        if (e instanceof HTMLFrameHyperlinkEvent) {
                            HTMLFrameHyperlinkEvent evt = (HTMLFrameHyperlinkEvent) e;
                            HTMLDocument doc = (HTMLDocument) pane.getDocument();
                            doc.processHTMLFrameHyperlinkEvent(evt);
                        } else {
                            try {
                                pane.setPage(e.getURL());
                            } catch (Throwable t) {
                                t.printStackTrace();
                            }
                        }
                    }
                }
            });
        } catch (IOException e) {
            loginPane.setContentType("text/html");
            loginPane.setText("<html>Could not load</html>");
        }

        JScrollPane scrollPane = new JScrollPane(loginPane);
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.getContentPane().add(scrollPane);
        this.setPreferredSize(new Dimension(800, 600));
        this.setVisible(true);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                SINGLETON.init();
            }
        });
    }

}

С помощью HyperlinkListener вы можете получить другую страницу при нажатии на ссылку. Это моя реализация Listener:

loginPane.setPage("https://jsp-password-checking-unibas.herokuapp.com");
        loginPane.addHyperlinkListener(new HyperlinkListener() {
            public void hyperlinkUpdate(HyperlinkEvent e) {
                if (e.getEventType() == HyperlinkEvent.EventType.ACTIVATED) {
                    JEditorPane pane = (JEditorPane) e.getSource();
                    if (e instanceof HTMLFrameHyperlinkEvent) {
                        HTMLFrameHyperlinkEvent evt = (HTMLFrameHyperlinkEvent) e;
                        HTMLDocument doc = (HTMLDocument) pane.getDocument();
                        doc.processHTMLFrameHyperlinkEvent(evt);
                    } else {
                        try {
                            pane.setPage(e.getURL());
                        } catch (Throwable t) {
                            t.printStackTrace();
                        }
                    }
                }
            }
        })

Обсуждая с другим пользователем в разделе комментариев этого ответа, мы пришли к выводу, что JEditorPane имеет определенные ограничения. Однако я искал другое решение для импорта веб-страницы в пользовательский интерфейс на основе Java. Вы можете сделать это, используя JavaFX.

Проверьте ссылку на документацию из oracle. и/или этот пост для справки.

Это базовый пример с JavaFX, который в основном делает то же самое, что и ранее показанный пример с использованием Swing.

import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.web.WebEngine;
import javafx.scene.web.WebView;
import javafx.stage.Stage;

public class LoginScreen extends Application {

    @Override
    public void start(final Stage stage) {

        WebView browser = new WebView();
        WebEngine webEngine = browser.getEngine();
        webEngine.load("https://jsp-password-checking-unibas.herokuapp.com");

        Scene scene = new Scene(browser, 800, 600);

        stage.setTitle("Login Example");
        stage.setScene(scene);

        stage.show();
    }

    public static void main(String[] args) {
        launch(args);
    }
}
person vincenzopalazzo    schedule 22.08.2019
comment
Извините, но это мне не поможет. Так что я поясню больше Precisley выше. - person ; 22.08.2019
comment
Я попробовал это решение на своей простой html-странице, но у меня было несколько проблем с ним. Для моей кнопки я бы получил только «нормальный» HyperlinkEvent вместо HTMLFrameHyperlinkEvent. Хотя я могу извлечь из него URL-адрес, мой сервер фактически ожидает запрос post, включающий данные из полей страницы. Также JEditorPane, похоже, полностью игнорирует css. Возможно, вы можете обновить свой пример с этой информацией. - person second; 22.08.2019
comment
Что касается проблемы css внутри JEditorPane, я думаю, что этот ответ является хорошим ссылкой, я попробуйте код с моим веб-приложением для входа в систему и работу с почтой запроса, я обновлю пример с моим веб-приложением - person vincenzopalazzo; 22.08.2019
comment
Вероятно, у него есть некоторые требования к тому, как html страница / form должна быть отформатирована для правильной работы, что означает, что он не подходит для каждой ситуации (особенно если вы не можете влиять на содержимое страницы). - person second; 22.08.2019
comment
Да, но я думаю, что JEditorPane — это уникальное решение, но в моем вопросе я добавил ссылку на другое решение. - person vincenzopalazzo; 23.08.2019
comment
@vincenzopalazzo: надеюсь, вы не возражаете, я отправил редактирование вашего ответа, чтобы улучшить вашу формулировку, и добавил пример для того же варианта использования на основе JavaFX. Работает намного лучше, чем решение на основе свинга, в том числе с моей страницей входа :) - person second; 23.08.2019
comment
Большое спасибо :) - person vincenzopalazzo; 23.08.2019
comment
@vincenzopalazzo: Кажется, часть редактирования была отменена @entpnerd. Не уверен, почему так. (Его все еще видно в истории редактирования). Я оставил ему сообщение в чате, не уверен, увидит ли он его. - person second; 23.08.2019
comment
Я не знаю причину, мы надеемся, что вы объясните нам причину здесь, в комментариях. - person vincenzopalazzo; 23.08.2019
comment
Нет, не вы, поэтому я думаю, что наше решение может вам помочь, если да, можно добавить голоса, чтобы удовлетворить нашу помощь. - person vincenzopalazzo; 23.08.2019
comment
@ XaNaX420: Если вам не нужно решать проблему с swing, попробуйте JavaFX. Как уже упоминалось, пример находится в истории редактирования. @vincenzopalazzo: я не получил ответа, но как владелец ответа вы можете прочитать пример, откатив изменение @entpnerd (или просто прочитав его). - person second; 23.08.2019
comment
Откат ответа, если @entpnerd ответит на наш вопрос, я изменю ответ - person vincenzopalazzo; 23.08.2019