Я хочу получить доступ к некоторым страницам веб-сайта https://myoffice.bt.com, который требует аутентификации пользователя с помощью Java. Мы должны регистрироваться сначала к страницам доступа. У меня есть wriiten после кода.
package root;
import java.io.IOException;
import org.apache.commons.httpclient.HttpClient;
import org.apache.commons.httpclient.UsernamePasswordCredentials;
import org.apache.commons.httpclient.auth.AuthScope;
import org.apache.commons.httpclient.methods.PostMethod;
import org.apache.commons.httpclient.params.HttpMethodParams;
public class Url
{
public static void main(String[] args) throws IOException
{
HttpClient client = new HttpClient();
client.getParams().setParameter(
HttpMethodParams.USER_AGENT,
"Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.2.2) Gecko/20100316 Firefox/3.6.2"
);
client.getState().setCredentials(
new AuthScope("https://myoffice.bt.com", 443, AuthScope.ANY_REALM),
new UsernamePasswordCredentials("username", "password") );
PostMethod get = new PostMethod("https://myoffice.bt.com/youraccount/default.aspx");
get.setDoAuthentication( true );
System.out.println(get.getFollowRedirects());
//get.setFollowRedirects(true);
try {
// execute the GET
int status = client.executeMethod( get );
// print the status and response
System.out.println(status + "\n" + get.getResponseBodyAsString());
} finally {
// release any connection resources used by the method
get.releaseConnection();
}
}
}
Но это дает следующие ошибки.
> Jun 22, 2010 12:14:40 PM org.apache.commons.httpclient.HttpMethodDirector isRedirectNeeded
INFO: Redirect requested but followRedirects is disabled
302
Если я некомментирую get.setFollowingRedirects строку, Она дает другую ошибку.
Exception in thread "main" java.lang.IllegalArgumentException: Entity enclosing requests cannot be redirected without user intervention
at org.apache.commons.httpclient.methods.EntityEnclosingMethod.setFollowRedirects(Unknown Source)
at root.Url.main(Url.java:30)
Кто-либо может помочь мне здесь? Мы можем сделать основанное на форме использование аутентификации HttpClient?
Спасибо.
Во-первых - не называйте свою PostMethod
переменной get
.
Во-вторых, попробуйте следующее:
PostMethod post = new PostMethod("yourUrl")
{
@Override
public boolean getFollowRedirects()
{
return true;
}
};
Если вы когда-нибудь окажетесь на «другой стороне» и захотите уберечь своих пользователей от страданий, используйте код ответа 303 (см. Другое)
при перенаправлении Запрос POST
к GET
вместо обычных 302
и 301
(согласно RFC ). Обычные браузеры, как правило, удобны, нарушают правила и НЕ просят нас подтверждать эти перенаправления, но многие мобильные браузеры все еще делают это.
Что касается вашего вопроса об аутентификации на основе форм - вам просто нужно выяснить, какие имена параметров использовать (например, посмотрев на источник веб-сайта, на котором вы «обычно» входите в систему), а затем заполните их соответствующими values:
post.addParameter("username", username);
post.addParameter("password", password);
Я поигрался с формой входа на myoffice.bt.com, в JavaScript кое-что происходит.
Форма отправляется на https://myoffice.bt.com/siteminderagent/forms/login.fcc
Были отправлены следующие элементы формы ( name = value
, некоторые значения были пустыми):
Segment=btb.hub
SubSegment=
searchType=0
searchPlatform=BEA
lob=btb.hub
queryText=
searchText=
ctl00$masterWebpartManager$gwpCustomLogin1$CustomLogin1$UserName=your@email.com
ctl00$masterWebpartManager$gwpCustomLogin1$CustomLogin1$PWD=yourpwd
ctl00$masterWebpartManager$gwpCustomLogin1$CustomLogin1$RememberMe=on
USER=your@email.com
PASSWORD=yourpwd
SMENC=ISO-8859-1
SMLOCALE=US-EN
userFirstLoginUrl=https://myoffice.bt.com/ManageBusinessApplications/SecretQA.aspx
PrivateLoginSuccessUrl=https://myoffice.bt.com/sm/privatecreatesession.aspx?siteArea=btb.mya
PublicLoginSuccessUrl=https://myoffice.bt.com/sm/createsession.aspx?siteArea=btb.mya
target=https://myoffice.bt.com/sm/privatecreatesession.aspx?siteArea=btb.mya&TARGET=https%3a%2f%2fmyoffice.bt.com%2fdefault.aspx (hidden)
submitStatus=
smauthreason=
smagentname=
postpreservationdata=
AnonUserName=anon@myoffice.bt.com
authMode=SITEMINDER
smUrl=https://myoffice.bt.com/siteminderagent/forms/login.fcc
notSMUrl=https://myoffice.bt.com/default.aspx
smIdentifier=1
Попробуйте добавить некоторые или все из них (по крайней мере ПОЛЬЗОВАТЕЛЬ
и ПАРОЛЬ
) в свой PostMethod
и убедитесь, что вы отправляют на правильный URL.
Если этот сайт использует аутентификацию Siteminder, вы не сможете войти просто так. Siteminder использует куки для идентификации аутентифицированных сессий. Эти файлы cookie действуют только до тех пор, пока ваша сессия жива. Если вы не вошли в систему, то сервер перенаправляет вас на страницу входа в Siteminder (отсюда и перенаправление). Поэтому вам нужно будет проследовать по перенаправлению, отправить свои учетные данные (имя пользователя/пароль), затем снова проследовать по перенаправлению, отправив полученные куки.
Я записывал сессии для регрессионных тестов с помощью The Grinder (http://grinder.sourceforge.net/), и он смог войти на защищенный Siteminder сайт автоматически! Так что это определенно возможно, но вам придется сделать немного больше, чем просто отправить HTTP-запрос...
Лучшим решением была бы какая-то другая аутентификация, например, на основе сертификатов (но, конечно, это должно быть настроено и на стороне сервера, так что в данном случае это может оказаться невозможным). Почему бы не спросить BT, предоставляют ли они другие методы аутентификации?
EDIT: Я только что нашел это: http://www.codeproject.com/KB/IP/SiteminderHttpWebRequest.aspx Исходный код на VB, но статья отличная, и перевести VB код на Java не должно быть проблемой... ;-)