Аутентификация через сайт POST на ASP и возвращение HTML-страницы

Я начал писать приложение, которое попадает на определенный веб-сайт и получает информацию на страницах более чистым способом. Моя первая проблема - аутентификация, чтобы я мог загрузить страницы. Это сайт: https://www.ims.tau.ac.il/Tal/. Это на иврите, но верхняя форма идет (сверху вниз): имя пользователя, идентификационный номер, пароль.

Когда я заполняю форму и нажимаю кнопку SUBMIT, я нажимаю F12 и вижу сообщение POST:

Request URL:https://www.ims.tau.ac.il/Tal/Login_Chk.aspx?rk=
Request Method:POST
Status Code:302 Found

Request Headersview parsed

POST /Tal/Login_Chk.aspx?rk= HTTP/1.1    
Host: www.ims.tau.ac.il    
Connection: keep-alive 
Content-Length: 82    
Cache-Control: max-age=0   
Origin: https://www.ims.tau.ac.il
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.2 (KHTML, like Gecko) Chrome/15.0.874.120 Safari/535.2   
Content-Type: application/x-www-form-urlencoded    
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8    
Referer: https://www.ims.tau.ac.il/Tal/    
Accept-Encoding: gzip,deflate,sdch    
Accept-Language: en-US,en;q=0.8    
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.3    
Cookie: ASP.NET_SessionId=2mi4i555jfibfb55wolrse55

Query String Parametersview URL encoded

rk:
Form Dataview URL encoded
user:MYUSERNAME
id_num:MYIDNUMBER
pass: MYREALPASSWORD
Enter.x:46
Enter.y:18
javatest:9
src:

Response Headersview parsed

HTTP/1.1 302 Found    
Date: Wed, 16 Nov 2011 21:25:46 GMT    
Server: Microsoft-IIS/6.0
X-Powered-By: ASP.NET    
X-AspNet-Version: 2.0.50727    
Location: Sys/Main.aspx?id=021653167&sys=tal&rk=&dt=16/11/2011 11:25:46 PM    
Cache-Control: private    
Content-Type: text/html; charset=utf-8   
Content-Length: 207

Я попытался сделать это самостоятельно из фрагментов кода, которые я нашел в других сообщениях на форуме, но я не смог заставить его работать:

public class MyTauRobot implements Runnable {

    private static final String TAG = "MyTauActivity";

    String name;
    String id;
    String pass;
    String result;

        public MyTauRobot() {
        super();
    }

    public MyTauRobot(String name, String id, String pass) {
        super();
        this.name = name;
        this.id = id;
        this.pass = pass;
    }

    @Override
    public void run() {
        HttpClient postClient = new DefaultHttpClient();
        HttpPost httpPost = new HttpPost("https://www.ims.tau.ac.il/Tal/Login_Chk.aspx?rk=");
        HttpResponse response;


        try {

            List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(2);
            nameValuePairs.add(new BasicNameValuePair("user", name));
            nameValuePairs.add(new BasicNameValuePair("id_num", id));
            nameValuePairs.add(new BasicNameValuePair("pass", pass));

            httpPost.setEntity(new UrlEncodedFormEntity(nameValuePairs));

            response = postClient.execute(httpPost);

            if(response.getStatusLine().getStatusCode() == 200) {
                HttpEntity entity = response.getEntity();

            }           

            Log.v(TAG,EntityUtils.toString(response.getEntity())); 

        } catch (Exception e) {
            Log.d(TAG, e.toString());
            Log.d(TAG, e.getCause().toString());
            }
        }
}

Когда я запускаю его, я получаю исключение.

org.apache.http.client.ClientProtocolException
11-19 22:42:48.758: D/MyTauActivity(726): org.apache.http.ProtocolException: Invalid redirect 
URI: Default.aspx?id=&rk=&src=&dt=20/11/2011 12:42:48 AM

ОБНОВЛЕНИЕ: я все еще получаю исключение, но я обнаружил, что atlist, кажется, регистрируется правильно, исключение происходит, потому что перенаправление является относительным, поэтому я получаю "main.aspx?..." вместо "http://www.tau.ac.il/ Тал /Sys/main.aspx?..."

Как мне это исправить?

org.apache.http.ProtocolException: Invalid redirect URI: Sys/Main.aspx?id=021653167&sys=tal&rk=&dt=25/11/2011 8:50:56 AM

2 ответа

Решение

Ну, я нашел решение.

Проблема заключалась в том, что сервер отвечал с относительными перенаправлениями и defaultHttpClient не мог следовать. Это странно, так как я установил на defaultHttpClient:

this.getParams().setParameter(ClientPNames.REJECT_RELATIVE_REDIRECT, false);

Но так как это не сработало, я решил попытаться сделать относительный адрес к абсолютному адресу, и я заставил его работать.

Все, что вам нужно сделать, это:

  1. Создайте пользовательский обработчик перенаправления и переопределите getLocation следующее:

    class CustomRedirectHandler extends DefaultRedirectHandler {
        @Override
        public URI getLocationURI(HttpResponse response, HttpContext context)
                throws ProtocolException {
            response.setHeader("Location", "http://www.ims.tau.ac.il/Tal/"+ response.getFirstHeader("Location").getValue().replace(" ", "%20"));        
            return super.getLocationURI(response, context);
        }
    }
    

где вместо "http://www.ims.tau.ac.il/Tal/" вы пишете свое абсолютное базовое местоположение для файлов.

Например, вам нужно http://www.google.com/index.html но сервер просто перенаправляет на index.html. Вы вводите "http://www.google.com/" в заголовок местоположения и объединяете ответ местоположения сервера, как в приведенном выше коде.

Кстати, сервер отвечал пробелами, с которыми снова возникла проблема DefaultHttpClient, поэтому вы заменяете пробелы на %20 заставить его работать.

  1. Настройте ваш HttpClient по умолчанию для использования нового обработчика перенаправления следующим образом:

    httpClient.setRedirectHandler(new CustomRedirectHandler());
    

Возможно, это не имеет значения. Проверьте ваш HttpResponse, если у вас есть cookie-файл для входа, вы можете использовать его дальше и просто игнорировать эту ошибку.

Другие вопросы по тегам