HttpClient4登陆有验证码的网站

news/2024/5/20 15:31:17/文章来源:https://blog.csdn.net/dlf123321/article/details/50779947
其实就这个问题,本来是很简单的,我自己花了近两个下午才搞定,现在记录一下。也希望能帮助后来的朋友。




先说httpclient

  操蛋的httpclent!
  为什么说操蛋呢,因为从httpclient3到httpclient4,有很大的变化,而且我自己水平也不够,在jar包上出了很多问题(例如我不知道还有个httpcore)。
  jar如下:


为了验证我们最后的程序

  我们可以先搭建一个带有验证码的登陆demo。

  参考如下:

登陆验证码(struts2实现)

分析一下 大致的处理流程

  以下面的login.jsp为例
<%@ page language="java" import="java.util.*" pageEncoding="GBK"%>
<%@ taglib prefix="s" uri="/struts-tags"%>
<html>
<head>
<script type="text/javascript">    
function changeValidateCode(obj) {    
/****   获取当前的时间作为参数,无具体意义   *   每次请求需要一个不同的参数,否则可能会返回同样的验证码    *   这和浏览器的缓存机制有关系,也可以把页面设置为不缓存,这样就不用这个参数了。  */var timenow = new Date().getTime();    obj.src="randPic?d="+timenow;    
}    
</script>
</head><body> <form name="" action="loginWithYZMAction" method="post">用户名<input type="text" name="name" > <br>验证码<input type="text" name="code" > <img src="randPic" οnclick="changeValidateCode(this)" title="点击图片刷新验证码" /> <br /><input type="submit" value="登陆" /><input type="reset" value="重置" /></form>
</body>
</html>


当我们在浏览器上,输入login.jsp的时候,我们其实向服务器发送了两次请求
第一次请求jsp,在浏览器解析jsp(准确的说是html)的时候发现
<img src="randPic" οnclick="changeValidateCode(this)" title="点击图片刷新验证码" /> <br />
然后就第二次向服务器发送了请求。
服务器第一次返回的信息里已经包含了session的id,我们要做的就是记录这个id
然后再向loginWithYZMAction这个action发送请求,当然得带上name,code还有之前得到的sessionid(cookie中保存的东西,除了sessionid,这些东西咱们后面再说)



然后关于验证码的读取,我现在使用的是人工读取,下一个步骤就是引入第三方的接口。




我们看代码说话
package com.zw;import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;import org.apache.commons.io.IOUtils;
import org.apache.http.Header;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.NameValuePair;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClientBuilder;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.util.EntityUtils;/** 这个用来测试 bjadmin*/
public class HttpProxyZW {//下面这两个url 第一个是登陆用的地址 第二个是获得验证码的地址private static String urlValidate="http://localhost:8600/BJAdmin/yzm/loginWithYZMAction";private static String urlGetCookieAndValidate="http://localhost:8600/BJAdmin/yzm/randPic";private  String cookie = null;/*** 以行为单位读取文件,常用于读面向行的格式化文件*/public static String getYZM(String fileName) {InputStream in = null;try {Thread.sleep(10000);in = new FileInputStream(new File(fileName));} catch (FileNotFoundException e) {e.printStackTrace();} catch (InterruptedException e) {e.printStackTrace();}Scanner s = new Scanner(in);while (s.hasNextLine()) {return s.nextLine();}return null;}public static void main(String[] args) {HttpProxyZW hp = new HttpProxyZW();hp.getPicAndCookie(hp.urlGetCookieAndValidate);List<NameValuePair> params = hp.getParameter();hp.getResponse2(hp.urlValidate, params);} public List<NameValuePair> getParameter(){List<NameValuePair> params=new ArrayList<NameValuePair>();params.add(new BasicNameValuePair("eticketNoORIn","123456"));params.add(new BasicNameValuePair("passengerName_src","啦啦啦"));try {params.add(new BasicNameValuePair("passengerName",URLEncoder.encode("啦啦啦", "utf-8")));} catch (UnsupportedEncodingException e) {e.printStackTrace();}params.add(new BasicNameValuePair("validateFlag","0"));params.add(new BasicNameValuePair("invoiceNo",""));params.add(new BasicNameValuePair("imgSrc","/tsky/images/loading.gif"));params.add(new BasicNameValuePair("eticketNo","123456"));params.add(new BasicNameValuePair("invoiceNo",""));//这个目前比较操蛋//在e盘下 我下载了验证码 //然后人工读出 后把字符写进src/yzm.txtString randCode=getYZM("src/yzm.txt");System.out.println(randCode);params.add(new BasicNameValuePair("code", randCode));return params;}private void downloadJPG(HttpResponse httpResponse) throws IOException {InputStream input = httpResponse.getEntity().getContent();  OutputStream output = new FileOutputStream(new File("E:\\1.jpg"));  IOUtils.copy(input, output);if (output != null) {output.close();}output.flush();  }/** 获取第一次下载图片的时候 远程服务器给我发的cookie*/public String getCookie(HttpResponse httpResponse) throws ClientProtocolException, IOException{String cookie="";Header[] headers=httpResponse.getHeaders("Set-Cookie");//BIGipServerpool_ip_port 这个参数是和负载均衡相关的//JSESSIONID 这就是sessionidfor(Header h:headers){if (h.getValue().contains("BIGipServerpool_122")) {String BIGipServerpool=h.getValue().substring("BIGipServerpool_122.119.122.179_80=".length(), h.getValue().indexOf(";"));cookie+="BIGipServerpool_122.119.122.179_80="+BIGipServerpool;}if (h.getValue().contains("JSESSIONID")) {String JSESSIONID=h.getValue().substring("JSESSIONID=".length(), h.getValue().indexOf(";"));cookie+="JSESSIONID="+JSESSIONID;}//这些参数的作用 我不清楚 加上就是了cookie+="Hm_lvt_486e71cc1c3c5d7a07853a6e72364f55=1456716098;__utma=88932958.523101033.1456716098.1456716098.1456716098.1;__utmz=88932958.1456716098.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none);CNZZDATA1256052643=1173832624-1456716029-%7C1456884431";}return cookie;}public CloseableHttpResponse getPicAndCookie(String url) {CloseableHttpClient httpclient = HttpClientBuilder.create().build();HttpPost httppost = new HttpPost(url);CloseableHttpResponse response =null;try {response = httpclient.execute(httppost);getCookie(response);downloadJPG(response);} catch (ClientProtocolException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}httppost.releaseConnection();return response;}public  void getResponse2(String url,List<NameValuePair> params)  {CloseableHttpClient httpclient = HttpClientBuilder.create().build();HttpPost httppost = new HttpPost(url);httppost.setHeader("Host", "www.travelsky.com");httppost.setHeader("User-Agent", "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:43.0) Gecko/20100101 Firefox/43.0");httppost.setHeader("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8");httppost.setHeader("Accept-Language", "zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3");httppost.setHeader("Referer", "http://www.travelsky.com/tsky/validate");httppost.setHeader("Cookie", cookie);httppost.setHeader("Connection", "keep-alive");try {if (params != null)httppost.setEntity(new UrlEncodedFormEntity(params, "utf-8"));CloseableHttpResponse response = httpclient.execute(httppost);HttpEntity entity = response.getEntity();String jsonStr = EntityUtils.toString(entity, "utf-8");System.out.println("final result" + jsonStr); httppost.releaseConnection();} catch (Exception e) {e.printStackTrace();}}}



参考资料

Cookie/Session机制详解
HttpClient4.x 使用cookie保持会话
HttpClient 解决中文乱码
使用HttpClient时遇到的 java.net.SocketException: Socket closed异常 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_827800.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

大型网站技术架构 读书笔记4 高可用架构

说句掏心窝的话,高可用甚至比高性能更重要。为什么? 因为你把系统的性能优化10倍,你的老板可能会说:小董呀,干的不错。 可是,如果你负责的模块,三天两头就宕掉了,嘿嘿,你懂得。 可用性度量 99%-----网站年度不可用时间小于88个小时 99.9%---网站年度不可用时间小于9个小时 99.…

大型网站技术架构 读书笔记3 高性能架构

很明显,这一章是说性能优化的,那么在说性能之前,我们得先了解性能的具体定义,也就是说如何评定一个系统性能是好还是不好。因此,我们就先说说性能测试,然后分别是前端性能,应用服务器的性能以及存储性能的优化。性能测试 1 不同的人对性能的认识是不一样的对用户来说,他们认为的…

大型网站技术架构 读书笔记2 大型网站核心架构要素

通常情况下,一个网站的架构出来功能性需求外,还应该考量以下五个方面:性能可用性伸缩性扩展性安全性性能 性能的官方解释,我就不说了。对用户来说,就是系统的反应速度是否快。对网站来说,性能问题是无处不在的,继而,我们优化性能的手段也有很多。我们从前到后一个一个来说在浏览…

大型网站技术架构 读书笔记1 大型网站架构模式

架构&#xff0c;又名软件架构&#xff0c;是有关软件整体结构与组件的抽象描述&#xff0c;用于指导大型软件系统各个方面的设计。 关于什么是模式&#xff0c;这个来自建筑学的词汇是这样定义的&#xff1a;“每一个模式描述了一个在我们周围不断重复发生的问题及该问题解决方…

大型网站架构之大型网站的演变过程

大型网站的演变过程 现在网站面临的问题&#xff1a; 1.企业在网站技术上的进行了大量的投入&#xff0c;但总是在关键的时刻频繁宕机&#xff08;高性能&#xff09;&#xff1b; 2.工程师夜以继日的加班工作&#xff0c;网站缺总是故障频繁、新功能上线缓慢&#xff08;扩展…

大型网站架构之大型网站架构模式

大型网站架构模式 什么是模式呢&#xff1f;(模式就是针对特定问题目前行业的解决方案) 模式描述了一个在我们周围不断重复发生的问题以及该问题解决方案的核心。借助模式我们可以减少很多重复的工作。 大型互联网公司在实践过程中提出了很多的解决方案&#xff0c;以实现网站…

大型网站架构之大型网站核心架构要素

大型网站核心架构要素 软件架构指的是&#xff0c;有关软件整体结构与组件的抽象描述&#xff0c;用于指导大型软件系统各方面的设计。 1.性能 在浏览器端 a.通过浏览器缓存、使用页面压缩、合理布局页面、减少Cookie传输等手段改善性能&#xff1b; b.可以使用CDN&#xff0c…

大型网站架构之性能篇

网站的高性能架构&#xff08;性能&#xff09; 不同视角下的网站性能有着不同的标准&#xff0c;也有不同的优化手段。 1.用户视角的网站性能优化 通过优化页面HTML样式、利用浏览器端的并发和异步特性&#xff08;即用户不用等待结果&#xff09;、调整浏览器缓存策略、使用…

大型网站之高可用篇

网站的高可用架构&#xff08;高可用&#xff09; 由于种种情况&#xff0c;在业务中硬件故障是常态&#xff0c;所以网站的高可用架构设计的主要目的就是保证服务器硬件故障时服务依然可用、数据依然保持并能够并访问。 高可用的主要手段&#xff1a;数据和服务的冗余备份及失…

大型网站之伸缩篇

网站的伸缩性架构&#xff08;伸缩性&#xff09; 绝大数网站都是渐进式成长的&#xff0c;在这个过程中最重要的技术是就是使用服务器集群&#xff0c;通过不断地向集群中添加服务器来增加整个集群的处理能力。 网站架构的伸缩性设计 网站的伸缩性设计分为两大类 根据功能进…

大型网站之扩展篇

网站的可扩展架构&#xff08;扩展性&#xff09; 伸缩性&#xff1a;通常指利用集群的方式增加服务器数量、提高系统的整体事务吞吐能力。 扩展性&#xff1a;指对现有系统影响最小的情况下&#xff0c;系统功能可持续扩展或提升的能力。 网站的可扩展性&#xff0c;依托于系…

大型网站之安全篇

网站的安全框架&#xff08;安全性&#xff09; a.黑客攻击 XSS攻击 XSS攻击即跨站点脚本攻击&#xff0c;指黑客通过篡改网页&#xff0c;注入恶意HTML脚本&#xff0c;在用户浏览网页时&#xff0c;控制用户浏览器进行恶意操作的一种攻击方式。 常见的XSS攻击分为 反射型&am…

使用openssl 模拟ca进行证书的申请和颁发,并使用证书部署网站的安全连接访问,即https的加密通信

亲测&#xff0c;已经建立了https链接 参考链接&#xff1a; https://blog.csdn.net/guoxiaojie_415/article/details/80554109 https://www.cnblogs.com/kezi/articles/11512420.html

浏览器版本过高导致无法访问网站 burpSuiteBrowser

错误&#xff1a; 建立安全连接失败 连接到 172.24.11.101 时发生错误。对等端使用了不支持的安全协议版本。 错误代码&#xff1a;SSL_ERROR_UNSUPPORTED_VERSION 由于不能验证所收到的数据是否可信&#xff0c;无法显示您想要查看的页面。 建议向此网站的管理员反馈这…

js 获取服务器ip_如何提高香港服务器网站的访问速度

从选择服务器上入手1.选择直连国内网络骨干的机房 直连国内网络骨干机房通常节点都比较少。通常数据在经过路由器进行转发时&#xff0c;都需要花费一定的时间&#xff0c;因而节点比较少的机房&#xff0c;它所提供的香港服务器多相对快一些&#xff0c;具体我们可以通过ping服…

php一维数组合并为二维数组,php输出数据并转换成若干一维数组最后合并为一条二维数组 - 傲世零零个人技术网站...

代码功能&#xff1a;php输出数据并转换成若干一维数组最后合并为一条二维数组//数据库连接require(db.php);//查询语句$sql2 "select * from xc_pic where xcid89 ";$result2 mysql_query($sql2,$conn);$dd0;while($row2 mysql_fetch_array($result2)){$dd$dd1…

逆向某电影网站signKey参数

1.打开我们要获取数据的页面 这里我们可以看到&#xff0c;这个有个加密参数signKey&#xff0c;猫眼好像改了&#xff0c;这个页面一些东西变成动态渲染了。他会发送一个请求去请求这个数据 我们打开这个页面&#xff0c;可以看到 这里面都是我们要的参数&#xff0c;像评分呀…

补某视频网站的js,进行视频解密

前言&#xff1a; 前不久&#xff0c;有个群友在群里发了一个视频的m3u8文件&#xff0c;其中的key是16字节&#xff0c;但是就是无法进行下载。但是用m3u8下载器进行下载时&#xff0c;无法下载下来&#xff0c;我开始怀疑是有请求头检验&#xff0c;用代码请求了一下&#x…

java web gzip_java使用gzip对静态资源的压缩,提供web网站访问速度

一、gzip简介Gzip是若干种文件压缩程序的简称&#xff0c;通常指GNU计划的实现&#xff0c;此处的gzip代表GNU zip。也经常用来表示gzip这种文件格式。软件的作者是Jean-loup Gailly和Mark Adler。在1992年10月31日第一次公开发布&#xff0c;版本号0.1&#xff0c;1993年2月&a…

Web大作业-关于创业计划网站制作的第二天......

嘶......转专业真的是麻烦&#xff0c;前有C语言大作业算法实现&#xff0c;现有Web工程网页要做..... 贴几张预览图吧&#xff0c;第一部分算是完成了&#xff0c;接下来还有两个部分&#xff0c;分别是宣传视频和个人计划的安排。 另外&#xff0c;学校的校园网真菜&#x…