HttpClient HTTP/1.1 302 Объект перемещен

Этот код работает для моей простой тестовой формы входа. Он использует POST для входа в систему, а затем выводит всю информацию на экран из журнала. Но это не работает на одном конкретном веб-сайте, я все время создавал этот код. Любые идеи, почему это происходит и как это исправить?

package visualutopiabot;

import org.apache.http.client.ResponseHandler;
import org.apache.http.impl.client.BasicResponseHandler;
import java.util.ArrayList;
import java.util.List;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.NameValuePair;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.protocol.HTTP;
import org.apache.http.util.EntityUtils;

    public class Main {

        public static void main(String[] args) throws Exception {

            DefaultHttpClient httpclient = new DefaultHttpClient();
            try {

                /* POST login */
                HttpPost httpost = new HttpPost("http://website.com/login.asp");

                List <NameValuePair> nvps = new ArrayList <NameValuePair>();
                nvps.add(new BasicNameValuePair("username", "nnnnick"));
                nvps.add(new BasicNameValuePair("password", "pppassswww123"));

                httpost.setEntity(new UrlEncodedFormEntity(nvps, HTTP.UTF_8));
                HttpResponse response = httpclient.execute(httpost);
                HttpEntity entity = response.getEntity();
                System.out.println("Login form get: " + response.getStatusLine());
                EntityUtils.consume(entity);

                /* get content*/
                HttpGet httpget = new HttpGet("http://website.com/index.asp");

                System.out.println("executing request " + httpget.getURI());

                // Create a response handler
                ResponseHandler<String> responseHandler = new BasicResponseHandler();
                String responseBody = httpclient.execute(httpget, responseHandler);
                System.out.println("----------------------------------------");
                System.out.println(responseBody);
                System.out.println("----------------------------------------");


            } finally {
                // When HttpClient instance is no longer needed,
                // shut down the connection manager to ensure
                // immediate deallocation of all system resources
                httpclient.getConnectionManager().shutdown();
            }
        }
    }

person heroix    schedule 17.11.2011    source источник


Ответы (4)


Если вы используете http://hc.apache.org/httpclient-3.x/

GetMethod имеет следующие перенаправления флаг установлен в true по умолчанию

Вы можете попробовать установить перенаправление на true явно для PostMethod

 PostMethod postMethod = ...;
 postMethod.setFollowRedirects(true)

Если вы используете http://hc.apache.org/httpcomponents-client-ga/

httpclient.setRedirectStrategy(new DefaultRedirectStrategy());
httpost.getParams().setParameter("http.protocol.handle-redirects",true);

См. http://hc.apache.org/httpcomponents-client-ga/tutorial/html/httpagent.html#d4e1192 для получения дополнительной информации.

person Prashant Bhate    schedule 17.11.2011

302 означает, что страница была перемещена. Вам нужно проверить заголовок Location в ответе и повторить запрос по URL-адресу в этом заголовке.

person Tarlog    schedule 17.11.2011

HTTP-код 302 — это один из способов сделать перенаправление. Ваш код, вероятно, правильно выполняет вход в систему, а затем сервер перенаправляет его на другую страницу. В любом случае вы должны увидеть заголовок Location: в ответе и следовать ему.

person Adam Zalcman    schedule 17.11.2011
comment
Да, местоположение указано другое. Допустим, заголовок показывает новое местоположение: YYY.com. Я изменил эту часть: HttpPost httpost = new HttpPost(YYY.com); Но это все еще не работает. - person heroix; 17.11.2011
comment
Вы не должны изменять первоначальный запрос на вход в систему, но добавьте другой запрос, как только вы будете перенаправлены ответом на вход. - person Adam Zalcman; 17.11.2011
comment
О, кажется, я нашел это. Забыл изменить имя пользователя и пароль на другие поля, которые использует сайт здесь: nvps.add(new BasicNameValuePair(username, nnnnick)); nvps.add (новый BasicNameValuePair (пароль, pppassswww123)); столько времени ушло на эту ошибку. - person heroix; 17.11.2011

Все это время ответ заключался в том, что я отправлял неправильные запросы POST. Вместо:

nvps.add(new BasicNameValuePair("username", "nnnnick"));
nvps.add(new BasicNameValuePair("password", "pppassswww123"));

Пришлось написать:

nvps.add(new BasicNameValuePair("login", "nnnnick"));
nvps.add(new BasicNameValuePair("pw", "pppassswww123"));
person heroix    schedule 24.11.2011