如何使用Apache HttpClient 4.2.1或>?对网站进行身份验证

时间:2012-02-29 23:54:34

标签: java apache-httpclient-4.x apache-httpcomponents

我是http编程的新手,我正在尝试对不使用API​​的网站进行身份验证,我遇到了一些麻烦。我发现了一些似乎与我相似的其他问题,但没有一个问题对我有用。

我尝试了几种不同的方法,但还没有找到一种方法。实际上,我曾经为它工作过一次,但没有检查那段代码(我知道 - 我在想什么?)。我再也无法回到那个工作版本了。以下是我迄今为止尝试过的一些事情:

    HttpClient client = new DefaultHttpClient(); //or any method to get a client instance, with a 'threadsafe' connection manager or otherwise
    Credentials credentials = new UsernamePasswordCredentials(userName, passwd);
    ((DefaultHttpClient) client).getCredentialsProvider()
                                .setCredentials(AuthScope.ANY, credentials);

// website is defined as my target website & this constitutes the valid login URL
    HttpPost post = new HttpPost(https + website + "/login");
    HttpEntity entity = new StringEntity("Username="+ userName +"&Password="+ passwd);
    post.setEntity(entity);

    HttpResponse response = client.execute(post);
    EntityUtils.consume(entity);
    entity = response.getEntity();
    EntityUtils.consume(entity);

// the protected part of the site is over http after authentication succeeds
    HttpGet get = new HttpGet(http + website +"/protected");
    response = client.execute(get);
    entity = response.getEntity();
    String content = EntityUtils.toString(entity);

此时我从网站上回来的'实体'是“错误”:“未经授权的访问”。

你会注意到我有一个'Credentials'实例被传递给HttpClient而且我还要输入用户名& HttpPost实体中的密码。我分别尝试了这些方法,他们都返回了“错误”:“未经授权的访问”。结果

我已经尝试过DefaultHttpClient,它使用单线程连接管理器,以及'ThreadSafeClientConnManager',但都没有工作。

2 个答案:

答案 0 :(得分:2)

首先尝试使用此网址登录(首先将网址复制到网页或其他内容 - 然后进行编辑):

https://www.centraldispatch.com/login?uri=%2Fprotected%2F&Username=XXX&Password=YYY

只需将您的真实用户/通行证替换为XXX和YYY - 确保其有效。

然后使用:

List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(1);
nameValuePairs.add(new BasicNameValuePair("Username","Your username"));
nameValuePairs.add(new BasicNameValuePair("Password","Your password"));
post.setEntity(new UrlEncodedFormEntity(nameValuePairs));
HttpResponse response = client.execute(post);
BufferedReader rd = new BufferedReader(new InputStreamReader(
   response.getEntity().getContent()));
   String line = "";
   while ((line = rd.readLine()) != null) {
      System.out.println(line);
   }

答案 1 :(得分:0)

您是否设置了用户代理?如此:

get.setHeader("Content-Type", "text/html");
get.setHeader("User-Agent","Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.0; .NET CLR 1.1.4322; .NET CLR 2.0.50215;)");
get.setHeader("Accept-Charset", Chareset+";q=0.7,*;q=0.7");//"utf-8;q=0.7,*;q=0.7");

也许你应首先获得登录页面,以使用cookie。

如果所有这些都不起作用,你可以使用firebug + firefox之类的工具来跟踪网络进程,并逐步进行操作。这应该可行。

网站检查某些字段,我认为这绝对是原因。