HttpClient - Cookies - и JEditorPane - PullRequest
       5

HttpClient - Cookies - и JEditorPane

1 голос
/ 26 апреля 2011

Мне удалось войти на сайт с помощью httpclient и распечатать файлы cookie, которые разрешают этот вход.Однако сейчас я застрял, потому что хотел отобразить последующие страницы в JEditorPane с помощью функции .setPage (url).Однако, когда я делаю это и анализирую свой запрос GET с помощью Wireshark, я вижу, что пользовательский агент - это не мой httpclient, а следующее:

User-Agent: Java / 1.6.0_17

GETВ запросе (который закодирован где-то в методе setPage (URL url) стороннего jeditorpane) нет файлов cookie, которые были получены с использованием httpclient.У меня вопрос - как я могу каким-то образом передать файлы cookie, полученные с помощью httpclient, чтобы мой JEditorPane мог отображать URL-адреса с сайта?Я начинаю думать, что это невозможно, и я должен попытаться войти в систему с использованием обычного Java URL-соединения и т. Д., Но предпочел бы придерживаться httpclient, поскольку он более гибок (я думаю).Предположительно, у меня все еще была бы проблема с файлами cookie. *

Я думал о расширении класса JEditorPane и переопределении setPage (), но я не знаю фактический код, который я должен вставить в него, так как не могупохоже, выясняется, как на самом деле работает setPage ().

Любая помощь / предложения будут с благодарностью.

Дейв

Ответы [ 2 ]

0 голосов
/ 23 февраля 2014

В Java 5 & 6 есть менеджер файлов cookie по умолчанию, который «автоматически» поддерживает HttpURLConnection, тип соединения, который JEditorPane использует по умолчанию.Исходя из этой записи в блоге , если вы напишите что-то вроде

CookieManager manager = new CookieManager();
manager.setCookiePolicy(CookiePolicy.ACCEPT_NONE);
CookieHandler.setDefault(manager);

, то для поддержки файлов cookie в JEditorPane будет достаточно.Обязательно добавьте этот код, прежде чем произойдет какое-либо интернет-общение с JEditorPane.

0 голосов
/ 26 апреля 2011

Как я уже упоминал в комментарии, HttpClient и URLConnection, используемые JEditorPane для получения содержимого URL, не общаются друг с другом.Таким образом, любые файлы cookie, которые может получить HttpClient, не будут переданы URLConnection.Тем не менее, вы можете создать подкласс JEditorPane следующим образом:

final HttpClient httpClient = new DefaultHttpClient();

/* initialize httpClient and fetch your login page to get the cookies */

JEditorPane myPane = new JEditorPane() {
    protected InputStream getStream(URL url) throws IOException {

        HttpGet httpget = new HttpGet(url.toExternalForm());

        HttpResponse response = httpClient.execute(httpget);
        HttpEntity entity = response.getEntity();

        // important!  by overriding getStream you're responsible for setting content type!
        setContentType(entity.getContentType().getValue());

        // another thing that you're now responsible for...  this will be used to resolve
        // the images and other relative references.  also beware whether it needs to be a url or string
        getDocument().putProperty(Document.StreamDescriptionProperty, url);

        // using commons-io here to take care of some of the more annoying aspects of InputStream
        InputStream content = entity.getContent();
        try {
            return new ByteArrayInputStream(IOUtils.toByteArray(content));
        }
        catch(RuntimeException e) {
            httpget.abort();  // per example in HttpClient, abort needs to be called on unexpected exceptions
            throw e;
        }
        finally {
            IOUtils.closeQuietly(content);
        }
    }
};

// now you can do this!
myPane.setPage(new URL("http://www.google.com/"));

Сделав это изменение, вы будете использовать HttpClient для получения содержимого URL для вашего JEditorPane.Обязательно прочитайте JavaDoc здесь http://download.oracle.com/javase/1.4.2/docs/api/javax/swing/JEditorPane.html#getStream(java.net.URL), чтобы убедиться, что вы поймали все угловые случаи.Я думаю, что большинство из них отсортировано, но я не эксперт.

Конечно, вы можете изменить часть кода HttpClient, чтобы избежать загрузки ответа в память в первую очередь, но этосамый краткий способ.И поскольку вы собираетесь загружать его в редактор, в какой-то момент все это будет в памяти.;)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...