Как войти в систему на веб-сайте с помощью Java

Я хочу получить доступ к некоторым страницам веб-сайта 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?

Спасибо.

6
задан Adeel Ansari 22 June 2010 в 07:32
поделиться

2 ответа

Во-первых - не называйте свою 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.

9
ответ дан 10 December 2019 в 00:32
поделиться

Если этот сайт использует аутентификацию 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 не должно быть проблемой... ;-)

1
ответ дан 10 December 2019 в 00:32
поделиться
Другие вопросы по тегам:

Похожие вопросы: