如何使用Java登录网站

Ran*_*ion 6 java forms-authentication httpclient

我想访问网站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();
     } 


 }

}
Run Code Online (Sandbox Code Playgroud)

但它会产生以下错误.

> Jun 22, 2010 12:14:40 PM org.apache.commons.httpclient.HttpMethodDirector isRedirectNeeded
INFO: Redirect requested but followRedirects is disabled
302
Run Code Online (Sandbox Code Playgroud)

如果我取消注释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)
Run Code Online (Sandbox Code Playgroud)

有人能帮我一下吗?我们可以使用HttpClient进行基于表单的身份验证吗?

谢谢.

Lau*_*nen 9

首先 - 请不要命名您的PostMethod变量get.

其次,试试这个:

PostMethod post = new PostMethod("yourUrl")
{
    @Override
    public boolean getFollowRedirects()
    {
        return true;
    }
};
Run Code Online (Sandbox Code Playgroud)

如果您碰巧遇到"另一方"并希望阻止您的用户受到影响,请303 (See Other)在将POST请求重定向到a GET而不是common (302301每个RFC)时使用响应代码.常规浏览器往往很好,违反规则而不是要求我们确认这些重定向,但很多移动浏览器仍然可以.

关于基于表单的身份验证的问题 - 您只需要找出要使用的参数名称(例如,查看"通常"登录的网站的来源),然后使用适当的值填充它们:

post.addParameter("username", username);
post.addParameter("password", password);
Run Code Online (Sandbox Code Playgroud)

我在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
Run Code Online (Sandbox Code Playgroud)

尝试将一些或所有这些(至少USERPASSWORD)添加到您的PostMethod,并确保您提交到正确的URL.