我该如何解决我的错误HTTP登录问题?

时间:2010-11-21 18:59:40

标签: java http

我正在尝试使用Apache HttpComponents Client在Java中模拟网站上的登录过程。它现在失败了,我不知道为什么。我在Firefox中使用Firebug来尝试理解等效的浏览器事件,我确信它是通过表单上的特定POST方法登录的。

这是我的代码。最后我希望设置一大堆cookie,但它们不是,并且我得到的后续GET请求的响应证明登录失败。

String email = ...
String password = ...
String url = ...
DefaultHttpClient client = new DefaultHttpClient();
List<NameValuePair> loginParams = new ArrayList<NameValuePair>(2);
loginParams.add(new BasicNameValuePair("logindetails[email]", email));
loginParams.add(new BasicNameValuePair("logindetails[password]", password));
UrlEncodedFormEntity loginEntity = new UrlEncodedFormEntity(loginParams);
HttpPost loginPost = new HttpPost(url);
loginPost.setEntity(loginEntity);
HttpResponse loginResponse = client.execute(loginPost);
HttpEntity loginRepsonseEntity = loginResponse.getEntity();
loginRepsonseEntity.consumeContent();

for (Cookie cookie: client.getCookieStore().getCookies()) {
    System.out.println(cookie.getName() + " -> " + cookie.getValue());
}

我应该从哪里开始寻找问题?我想验证POST与我的浏览器的POST是一样的 - 最好的方法是什么?

3 个答案:

答案 0 :(得分:2)

我们每天在工作的地方使用Apache HttpClient,这太棒了。你在做什么,你自己编码数据,对我来说看起来有点奇怪。有一种更简单的方法。我假设你正在做一个帖子。

String email = ...
String password = ...
String url = ...

PostMethod post = new PostMethod(url);

NameValuePair[] data = {
    new NameValuePair("logindetails[email]", email),
    new NameValuePair("logindetails[password]", password)
};

post.setRequestBody(data);

// execute method and handle any error responses.

HttpClient httpclient = new HttpClient();

int statusCode = httpclient.executeMethod(post);

// continue as neccessary

我从Apache HttpClient站点获取了该代码(并对其进行了修改以使其更适合您)。除非你有充分的理由,否则你不需要使用UrlEncodedFormEntity自行打包字段。

至于调试这种东西,最简单的方法是使用WireShark来观察数据包的来回。其中任何一个都可以让你来回查看请求(只要你不使用HTTPS),这样你就可以通过将它与浏览器发送的内容进行比较,轻松地告诉错误发送的内容。它不是世界上用户最友好的程序,但在试图弄清楚这种东西时它是非常宝贵的。

答案 1 :(得分:1)

您可以在Firefox中使用Firebug查看网络标签,以调查在您使用网页时如何完成帖子。看看你的代码,我的猜测是你的参数名称很奇怪。 logindetails[email]logindetails[password]看起来很奇怪。

这相当于:

<form action="...url" method="post">
   email: <input type="text" name="logindetails[email]"/><br/>
   password: <input type="password" name="logindetails[password]"/><br/>
   <input type="submit" value="submit"/>
</form>

确保这是你想要的......

答案 2 :(得分:0)

看看精彩的cURL实用程序 - &gt; http://curl.haxx.se/docs/manpage.html

它在Unix / Linux中无处不在,可以在Windows下的Cygwin下使用。

它允许您通过命令行中的几次击键实现您在Java中尝试执行的操作。