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(); } }
感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!