Java httpclient для входа на сайт и загрузки файла - Проблемы с сеансом!

91
13

Я запишусь на веб-сайт, используя метод POST (httpclient от apache).
Я разрешаю HttpClient выполнить HttpPost, пусть диспетчер подключений выпустит его, а затем я хочу опубликовать сообщение GET, которое открывает файл php-URL для загрузки pdf.
Но все, что я получаю, это html файл страницы с истекшим сроком действия
(println: File: index_GT_neu.html?fehlermeldung=fehler_sessioncheck)


Я думал, что, как только я использовал экземпляр HttpClient для входа на сайт, я смог бы открыть еще один URL-адрес, доступный только после входа в систему. Но, видимо, я ошибся.
Кто-нибудь может дать мне подсказку?
Спасибо заранее!


Это то, что мой главный выглядит:


    // prepare post method
HttpPost post = new HttpPost("http://epaper02.niedersachsen.com/epaper/index_GT_neu.html");

//prepare get method
HttpGet httpget = new HttpGet("http://epaper01.niedersachsen.com/epaper/getfile.php?pdf=0114_GTB_HP_01.pdf&zeitung=GT&ekZeitung=&Y=11&M=01&D=14&C=0");

// add parameters to the post method
List <NameValuePair> parameters = new ArrayList <NameValuePair>();
parameters.add(new BasicNameValuePair("username", "test"));
parameters.add(new BasicNameValuePair("passwort", "test"));
UrlEncodedFormEntity sendentity = new UrlEncodedFormEntity(parameters, HTTP.UTF_8);
post.setEntity(sendentity);

// create the client and execute the post method
HttpClient client = new DefaultHttpClient();
HttpResponse postResponse = client.execute(post);

//Output the Response from the POST
System.out.print(convertInputStreamToString(postResponse.getEntity().getContent()));

//releasing POST
EntityUtils.consume(postResponse.getEntity());

//Execute get
HttpContext context = new BasicHttpContext();
HttpResponse getResponse = client.execute(httpget, context);
System.out.println("Statusline: " + getResponse.getStatusLine());

if (getResponse.getStatusLine().getStatusCode() != HttpStatus.SC_OK)
throw new IOException(getResponse.getStatusLine().toString());
HttpUriRequest currentReq = (HttpUriRequest) context.getAttribute(ExecutionContext.HTTP_REQUEST);
String currentUrl = URLDecoder.decode(currentReq.getURI().toString(), "UTF-8");

int i = currentUrl.lastIndexOf('/');
String fileName = null;
if (i < 0) {
fileName = currentUrl;
} else {
fileName = currentUrl.substring(i + 1);
}
System.out.println("File: " + fileName);

//Create file
OutputStream os = new FileOutputStream( fileName);
InputStream is = getResponse.getEntity().getContent();
byte[] buf = new byte[4096];
int read;
while ((read = is.read(buf)) != -1) {
os.write(buf, 0, read);
}
os.close();

client.getConnectionManager().shutdown();

спросил(а) 2021-01-19T17:14:36+03:00 6 месяцев, 2 недели назад
1
Решение
64

По умолчанию DefaultHttpClient не имеет хранилища файлов cookie. Для хранения файлов cookie, которые были заполнены изначально или которые получены при взаимодействии с клиентом HTTP, необходим хранилище файлов cookie. Как только вы вникнете в эту тему, вы начнете думать о области/совместном использовании файлов cookie.


Вы можете включить хранилище cookie с одной дополнительной строкой кода:

DefaultHttpClient client = new DefaultHttpClient();
client.setCookieStore(new BasicCookieStore());

Я знаю, это может быть немного поздно, но HTH.

ответил(а) 2021-01-19T17:14:36+03:00 6 месяцев, 2 недели назад
45

Я не знаком с этой библиотекой, но попробую создать контекст перед вызовом сообщения и повторным использованием того же контекста для get:

   HttpContext context = new BasicHttpContext();
// create the client and execute the post method
HttpClient client = new DefaultHttpClient();
HttpResponse postResponse = client.execute(post,context);
...

HttpResponse getResponse = client.execute(httpget, context);

ответил(а) 2021-01-19T17:14:36+03:00 6 месяцев, 2 недели назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема