java web中 HttpClient模拟浏览器登录后发起请求
HttpClient模拟浏览器登录后发起请求
浏览器实现这个效果需要如下几个步骤:
1请求一个需要登录的页面或资源
2服务器判断当前的会话是否包含已登录信息。如果没有登录重定向到登录页面
3手工在登录页面录入正确的账户信息并提交
4服务器判断登录信息是否正确,如果正确则将登录成功信息保存到session中
5登录成功后服务器端给浏览器返回会话的SessionID信息保存到客户端的Cookie中
6浏览器自动跳转到之前的请求地址并携带之前的Cookie(包含登录成功的SessionID)
7服务器端判断session中是否有成功登录信息,如果有则将请求的资源反馈给浏览器
packagecom.artsoft.demo;
importjava.io.FileOutputStream;
importorg.apache.http.HttpEntity;
importorg.apache.http.HttpResponse;
importorg.apache.http.client.CookieStore;
importorg.apache.http.client.methods.HttpGet;
importorg.apache.http.client.methods.HttpPost;
importorg.apache.http.impl.client.DefaultHttpClient;
importorg.apache.http.impl.conn.PoolingClientConnectionManager;
importorg.apache.http.util.EntityUtils;
/**
*TODO(用一句话描述该文件的作用)
*
*@title:HttpClientDemo.java
*@authorzhangjinshan-ghq
*@date2014-6-1114:59:04
*/
publicclassHttpClientDemo
{
/**
*Themainmethod.
*
*@paramargsthearguments
*@throwsExceptiontheexception
*/
publicstaticvoidmain(String[]args)throwsException
{
getResoucesByLoginCookies();
}
/**
*根据登录Cookie获取资源
*一切异常均未处理,需要酌情检查异常
*
*@throwsException
*/
privatestaticvoidgetResoucesByLoginCookies()throwsException
{
HttpClientDemodemo=newHttpClientDemo();
Stringusername="......";//登录用户
Stringpassword="......";//登录密码
//需要提交登录的信息
StringurlLogin="http://hx.buscoming.cn/Api/Security/Logon?UserCode="+username+"&Password="+password;
//登录成功后想要访问的页面可以是下载资源需要替换成自己的iteyeBlog地址
StringurlAfter="http://hx.buscoming.cn/Api/Security/GetLoginAccount";
DefaultHttpClientclient=newDefaultHttpClient(newPoolingClientConnectionManager());
/**
*第一次请求登录页面获得cookie
*相当于在登录页面点击登录,此处在URL中构造参数,
*如果参数列表相当多的话可以使用HttpClient的方式构造参数
*此处不赘述
*/
HttpPostpost=newHttpPost(urlLogin);
HttpResponseresponse=client.execute(post);
HttpEntityentity=response.getEntity();
CookieStorecookieStore=client.getCookieStore();
client.setCookieStore(cookieStore);
/**
*带着登录过的cookie请求下一个页面,可以是需要登录才能下载的url
*此处使用的是iteye的博客首页,如果登录成功,那么首页会显示【欢迎XXXX】
*
*/
HttpGetget=newHttpGet(urlAfter);
response=client.execute(get);
entity=response.getEntity();
/**
*将请求结果放到文件系统中保存为myindex.html,便于使用浏览器在本地打开查看结果
*/
StringpathName="d:\\index.html";
writeHTMLtoFile(entity,pathName);
}
/**
*WritehtmLtofile.
*将请求结果以二进制形式放到文件系统中保存为.html文件,便于使用浏览器在本地打开查看结果
*
*@paramentitytheentity
*@parampathNamethepathname
*@throwsExceptiontheexception
*/
publicstaticvoidwriteHTMLtoFile(HttpEntityentity,StringpathName)throwsException
{
byte[]bytes=newbyte[(int)entity.getContentLength()];
FileOutputStreamfos=newFileOutputStream(pathName);
bytes=EntityUtils.toByteArray(entity);
fos.write(bytes);
fos.flush();
fos.close();
}
}
感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!