Java JTextPane HTML-файлы изображений - PullRequest
0 голосов
/ 06 декабря 2010

Я использую JTextPane для отображения данных с веб-страницы, которая не принадлежит мне, поэтому я не могу контролировать ее содержимое. Для этого требуется, чтобы пользователь вошел в систему, поэтому я использую URLConnections для подключения к этой веб-странице и использую файлы cookie в URLConnection для получения данных. Это отлично работает. Однако, когда я помещаю эти данные в JTextPane с типом содержимого, установленным в text / html, изображения не отображаются, так как они требуют, чтобы эти куки с идентификатором сеанса и материалом были отправлены для получения загруженных изображений.

Можно ли как-нибудь заставить JTextPane (хотя я могу использовать что-либо еще в jdk, отображающем html) использовать мои куки?

Спасибо.

Я храню файлы cookie в связанном списке:

    loadText = "Logging in...";
    url = new URL("http://www.example.com/login.php");
    connection = url.openConnection();

    connection.setDoOutput(true);

    OutputStreamWriter out = new OutputStreamWriter(
            connection.getOutputStream());
    out.write("username=" + URLEncoder.encode(username, "UTF-8")
            + "&password=" + URLEncoder.encode(password, "UTF-8")
            + "&testcookies=1");
    out.flush();
    out.close();
            List<String> cookies = new LinkedList<String>();
    for (int i = 1; (headerName = connection.getHeaderFieldKey(i)) != null; i++) {
        if (headerName.equals("Set-Cookie")) {
            String cookie = connection.getHeaderField(i);
            cookie = cookie.substring(0, cookie.indexOf(";"));
            cookies.add(cookie);
        }
    }

И мне также нужно убрать лишний HTML, который дает мне строку, которую я вставляю в текстовое поле:

String p1 = rawPage.split("<div id=\"contentstart\">")[1]
                        .split("</div><!--id='contentstart'-->")[0];
                p1 = p1.replaceAll("<p><strong></strong></p>", "");
                p1 = p1.replaceAll("<p></p>", "");
                parsed = true;
                JTextPane tp = new JTextPane();
                tp.setEditable(false);
                JScrollPane js = new JScrollPane();
                js.getViewport().add(tp);
                js.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
                getContentPane().add(js);
                js.setSize(640, 480);
                tp.setContentType("text/html");
                tp.setText(p1);

Ответы [ 2 ]

0 голосов
/ 06 декабря 2010

Cookies хранятся относительно вашего браузера. Например, если у вас есть файлы cookie в Firefox, Microsoft IE не сможет их увидеть. Аналогичным образом, файлы cookie, полученные с веб-страницы, которую вы ищете, недоступны для вашего Java-приложения.

Кроме того, JTextPane не является полнофункциональным HTML-браузером. Вы можете использовать его для рендеринга базового HTML (на самом деле HTML 2.0, гораздо более старая версия HTML), но он не будет работать с файлами cookie, CSS и другими стандартными веб-функциями.

Возможно, вы захотите взглянуть на полнофункциональные веб-браузеры, такие как Flying Saucer - см. http://weblogs.java.net/blog/2007/07/14/flying-saucer-r7-out

Но даже если вы сделаете это, «Летающая тарелка» не увидит файлы cookie, полученные вами через другие браузеры.

0 голосов
/ 06 декабря 2010

Вы не читаете контент из URLConnection? Нечто подобное может помочь. Опубликуйте свой код, чтобы мы могли лучше понять.

JTextPane pane;
..
HTMLDocument htmlDocument = (HTMLDocument) pane.getDocument();
htmlDocument.putProperty("IgnoreCharsetDirective", Boolean.TRUE);
htmlDocument.putProperty(Document.StreamDescriptionProperty, pageUrl);
pane.read(connection.getInputStream, htmlDocument);

- или -

Вы можете попробовать компонент Swing браузера вместо JTextPane.

http://djproject.sourceforge.net/ns/index.html

...