аутентификация через сайт POST на ASP и возврат HTML-страницы - PullRequest
0 голосов
/ 20 ноября 2011

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

Когда я заполняю форму и нажимаю кнопку ОТПРАВИТЬЯ нажимаю 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, кажется, входит в систему правильно, исключение возникает, потому чтоперенаправление относительное, поэтому вместо «http://www.tau.ac.il/Tal/Sys/main.aspx?..."

я получаю« 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 ]

2 голосов
/ 01 января 2012

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

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

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());
    
0 голосов
/ 20 ноября 2011

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

...