您的位置:首页 > 理论基础 > 计算机网络

使用HttpClient模拟登陆

2011-02-18 11:13 211 查看
在使用Hyperic HQ做集群监控的时候,有时要按照需要使用Groovy插件对Hyperic的数据库进行查询被在浏览器中返回结果。这个查询是远程的,而且对Hyperic进行URL请求(Hyperic的Groovy插件需要通过URL调用)时,首先会临时性的跳转到登陆界面,让用户输入口令,人工操作的话当然没有什么问题,可是查询过程是完全定时的,这就需要有自动登陆功能。

Java自带的HttpURLConnection无法满足要求(或者是我没找到),后来我找到了一个叫curl的工具,它是Linux环境下,是以Shell的形式运行的,通过执行curl -u username:password url命令,可以直接获取登陆后的页面编码,可以在程序中,调用系统命令来执行这段代码,可遗憾的是,curl没法在Windows下被安装成功,而且它作为一个独立的程序而不是库的形式,显然也不是不够友好的,所以也被放弃了。最终,我找到了大名鼎鼎的HttpClient,它用起来很简单,但是找到如果自动登陆的方法,也费了一番功夫。最终解决方案是,首先观察登陆界面的源代码,发现有一个叫j_spring_security_check的函数,它申明自己是PostMethod,其中就包含了账号密码的验证,从中可以看出,账号对应的名称是j_username,密码是j_password。所以我们需要建立一个HttpClient,然后对登陆界面的URL执行PostMethod来进行模拟登陆。代码如下所示:

PostMethod post = new PostMethod(
"http://133.133.133.83:7080/j_spring_security_check");
NameValuePair username = new NameValuePair("j_username", "hqadmin");
NameValuePair password = new NameValuePair("j_password", "hqadmin");
post.setRequestBody(new NameValuePair[]{username, password});
client.executeMethod(post);
System.out.println(post.getStatusLine());
Header locationHeader = post.getResponseHeader("location");
System.out.println(locationHeader.getValue());
post.releaseConnection();

之后,在使用同一个HttpClient访问URL的话,就会被Hyperic认为是登陆过的了,可以直接使用GetMethod获取自己想要的页面。

GetMethod get = new GetMethod(
"http://133.133.133.83:7080/hqu/cloudmonitor/cloud/execute.hqu");
client.executeMethod(get);
InputStream input = get.getResponseBodyAsStream();
SAXReader sax = new SAXReader();
doc = sax.read(input);

并且通过getResponseBodyAsStream()函数,来将访问的页面转化为输入流并解析(页面的内容是XML形式的数据)。至此,我们完成了使用HttpClient来进行模拟登陆的工作。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: