Файлы cookie HTML-изображений Java JTextPane

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

Есть ли способ заставить JTextPane (хотя я могу использовать что-либо еще в jdk, отображающем html) использовать мои файлы cookie?

Спасибо.

Я храню файлы 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);

person Barry Smith    schedule 06.12.2010    source источник


Ответы (2)


Вы не читаете содержимое URLConnection? Что-то вроде этого может помочь. Опубликуйте свой код, чтобы мы могли получить больше информации.

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

-- or --

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

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

person ring bearer    schedule 06.12.2010
comment
Я разместил соответствующие фрагменты кода — мне нужно удалить лишний HTML, чтобы оставить только то, что мне нужно. - person Barry Smith; 06.12.2010

Файлы cookie сохраняются в отношении вашего браузера. Например, если у вас есть файлы cookie в Firefox, Microsoft IE не увидит эти файлы cookie. Точно так же файлы 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

Но даже если вы сделаете это, Flying Saucer не увидит файлы cookie, которые вы получили через другие браузеры.

person David Koelle    schedule 06.12.2010
comment
Да, я знаю это; поэтому я создаю строковый массив всех файлов cookie, установленных сервером, в заголовке Set-Cookie и отправляю его обратно при выполнении любых дальнейших запросов, чтобы обмануть сервер, заставив его думать, что мы действительно храним их столько, сколько он хочет. - person Barry Smith; 06.12.2010