Аутентификация через сайт 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);
Но так как это не сработало, я решил попытаться сделать относительный адрес к абсолютному адресу, и я заставил его работать.
Все, что вам нужно сделать, это:
Создайте пользовательский обработчик перенаправления и переопределите
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
заставить его работать.
Настройте ваш HttpClient по умолчанию для использования нового обработчика перенаправления следующим образом:
httpClient.setRedirectHandler(new CustomRedirectHandler());
Возможно, это не имеет значения. Проверьте ваш HttpResponse, если у вас есть cookie-файл для входа, вы можете использовать его дальше и просто игнорировать эту ошибку.