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

Я захожу на сайт, используя метод 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();

Ответы [ 2 ]

1 голос
/ 13 марта 2015

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

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

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

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

0 голосов
/ 15 января 2011

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

   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);
...