[求助]如何把本地的Httpclient应用到web上面

NicholasYao 2014-11-01 10:03:00
经过各位大神的指教 终于在本地实现了带验证码的get请求
思路是先把验证码下载到本地 然后在命令行输入验证码再执行请求
但是我这种办法好像没法移植到Web,不知各位有什么好的解决办法

本地运行的代码如下:
public class test {

public static final DefaultHttpClient hc;
public static final String USER_AGENT = "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/38.0.2125.111 Safari/537.36";
public static final CookieStore cookieStore;

static{
PoolingClientConnectionManager tsccm = new PoolingClientConnectionManager();
HttpParams params = new BasicHttpParams();
HttpProtocolParamBean paramBean = new HttpProtocolParamBean(params);
paramBean.setContentCharset("UTF-8");
paramBean.setUseExpectContinue(true);
paramBean.setUserAgent(USER_AGENT);
paramBean.setVersion(HttpVersion.HTTP_1_1);
hc = new DefaultHttpClient(tsccm, params);
tsccm.setMaxTotal(100);
cookieStore = new BasicCookieStore();
hc.setCookieStore(cookieStore);
}
public static void main(String[] args) throws Exception {

//get验证码并下载到本地磁盘
byte[] temp = getValidateCode();
byte2image(temp);
//在命令行输入验证码
Scanner sca=new Scanner(System.in);
String cCode=sca.next();

System.out.println(get(cCode));

}
//get body
public static String get(String code) {
String body = null;
//构造请求地址
String url="http://www.***.com/query?id=123&password=123&rand="+code;
try {

// Get请求
HttpGet httpget = new HttpGet(url);
HttpResponse httpresponse = hc.execute(httpget);
// 获取返回数据
HttpEntity entity = httpresponse.getEntity();
body = EntityUtils.toString(entity);

if (entity != null) {
entity.consumeContent();
}
} catch (ParseException e) {
e.printStackTrace();
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return body;
}

//get验证码
public static byte[] getValidateCode() {
byte[] cCode = null ;
try {

// Get请求
HttpGet httpget = new HttpGet("http://query.5184.com/query/image.jsp");

HttpResponse httpresponse = hc.execute(httpget);
HttpEntity entity = httpresponse.getEntity();

cCode = EntityUtils.toByteArray(entity);

if (entity != null) {
entity.consumeContent();
}
} catch (ParseException e) {
e.printStackTrace();
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}

return cCode;
}

//下载验证码
public static void byte2image(byte[] data){
String path ="C:/1.jpg";

if(data.length<3||path.equals("")) return;
try{
FileImageOutputStream imageOutput = new FileImageOutputStream(new File(path));
imageOutput.write(data, 0, data.length);
imageOutput.close();
System.out.println("Make Picture success,Please find image in " + path);
} catch(Exception ex) {
System.out.println("Exception: " + ex);
ex.printStackTrace();
}
}

}
...全文
250 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
NicholasYao 2014-11-05
  • 打赏
  • 举报
回复
引用 12 楼 crazypandariy 的回复:
[quote=引用 9 楼 sinat_21607571 的回复:] [quote=引用 5 楼 littlebrain4solving 的回复:] [quote=引用 4 楼 sinat_21607571 的回复:] [quote=引用 3 楼 littlebrain4solving 的回复:] [quote=引用 2 楼 sinat_21607571 的回复:] [quote=引用 1 楼 littlebrain4solving 的回复:] 如果使用WEB应用的话,其实你可以不用使用HTTPClient来实现这个功能,当然如果你想这样做也是可以的。 你直接在Servlet的Init(初始化)方法中执行这个方法、你也可以发送一个request来执行这个方法;很多种方式 都可以执行你想要的内容。
想做成网页,不用httpclient还有什么可以来实现这个功能 然后这个登录是涉及到验证码的,登陆后抓取其他页面进行整理再返回给用户,每个用户都不同,在inti里面不合适吧,还有如果要在request里面实现要怎么操作[/quote] 你之所以使用HTTPClient同样是发一个请求到远程链接实现功能,你也同样可以用JavaScript的Ajax发送Post请求。[/quote] 如果一定要用httpclient的话怎么处理验证码输入这个问题~[/quote] 如果是这样的话,你的HttpClient肯定是在request时进行处理的,你可以把这个验证码图片的链接显示在页面上,你前台输入验证码后再提交,这个时候request获取输入的验证码进行处理呀。[/quote] 嗯嗯恩, 我的方法是在loginservlet的doget()里生成验证码 , 然后在jsp里面img元素的src指向"loginservlet",表单的action是post,在doPost()里面处理,这样好像也可以,但是感觉逻辑怪怪的[/quote] localhost:8080/test 比如你的工程是test,你把图片a.jpg保存到了工程根目录下的image文件夹,那么在页面中<img src="image/a.jpg"/> 或者<img src="localhost:8080/test/image/a.jpg"/>[/quote] 还是没搞懂,这个过程是独立写一个servlet,还是跟form的action写在同一个servlet,然后要写在哪个位置,我原来的方法在本地可以跑,上传到SAE会说验证码错误~
疯狂熊猫人 2014-11-03
  • 打赏
  • 举报
回复
引用 9 楼 sinat_21607571 的回复:
[quote=引用 5 楼 littlebrain4solving 的回复:] [quote=引用 4 楼 sinat_21607571 的回复:] [quote=引用 3 楼 littlebrain4solving 的回复:] [quote=引用 2 楼 sinat_21607571 的回复:] [quote=引用 1 楼 littlebrain4solving 的回复:] 如果使用WEB应用的话,其实你可以不用使用HTTPClient来实现这个功能,当然如果你想这样做也是可以的。 你直接在Servlet的Init(初始化)方法中执行这个方法、你也可以发送一个request来执行这个方法;很多种方式 都可以执行你想要的内容。
想做成网页,不用httpclient还有什么可以来实现这个功能 然后这个登录是涉及到验证码的,登陆后抓取其他页面进行整理再返回给用户,每个用户都不同,在inti里面不合适吧,还有如果要在request里面实现要怎么操作[/quote] 你之所以使用HTTPClient同样是发一个请求到远程链接实现功能,你也同样可以用JavaScript的Ajax发送Post请求。[/quote] 如果一定要用httpclient的话怎么处理验证码输入这个问题~[/quote] 如果是这样的话,你的HttpClient肯定是在request时进行处理的,你可以把这个验证码图片的链接显示在页面上,你前台输入验证码后再提交,这个时候request获取输入的验证码进行处理呀。[/quote] 嗯嗯恩, 我的方法是在loginservlet的doget()里生成验证码 , 然后在jsp里面img元素的src指向"loginservlet",表单的action是post,在doPost()里面处理,这样好像也可以,但是感觉逻辑怪怪的[/quote] localhost:8080/test 比如你的工程是test,你把图片a.jpg保存到了工程根目录下的image文件夹,那么在页面中<img src="image/a.jpg"/> 或者<img src="localhost:8080/test/image/a.jpg"/>
  • 打赏
  • 举报
回复
你的JSP的<IMG>标签直接指向源图片地址不就好了,为什么非得要指向你的servlet。
NicholasYao 2014-11-03
  • 打赏
  • 举报
回复
引用 7 楼 crazypandariy 的回复:
服务器端获取到验证码图片后,保存,将图片的路径返回给浏览器,浏览器动态创建一个img元素并将src指向图片路径即可
不好意思说错了。嗯,这个保存跟将src指向图片路径是怎么实现的? 我的方法是在loginservlet的doget()里生成验证码 , 然后在jsp里面img元素的src指向"loginservlet",表单的action也是"loginservlet"!!!,method是post,在doPost()里面处理,这样好像也可以,但是感觉逻辑怪怪的,
NicholasYao 2014-11-03
  • 打赏
  • 举报
回复
引用 5 楼 littlebrain4solving 的回复:
[quote=引用 4 楼 sinat_21607571 的回复:] [quote=引用 3 楼 littlebrain4solving 的回复:] [quote=引用 2 楼 sinat_21607571 的回复:] [quote=引用 1 楼 littlebrain4solving 的回复:] 如果使用WEB应用的话,其实你可以不用使用HTTPClient来实现这个功能,当然如果你想这样做也是可以的。 你直接在Servlet的Init(初始化)方法中执行这个方法、你也可以发送一个request来执行这个方法;很多种方式 都可以执行你想要的内容。
想做成网页,不用httpclient还有什么可以来实现这个功能 然后这个登录是涉及到验证码的,登陆后抓取其他页面进行整理再返回给用户,每个用户都不同,在inti里面不合适吧,还有如果要在request里面实现要怎么操作[/quote] 你之所以使用HTTPClient同样是发一个请求到远程链接实现功能,你也同样可以用JavaScript的Ajax发送Post请求。[/quote] 如果一定要用httpclient的话怎么处理验证码输入这个问题~[/quote] 如果是这样的话,你的HttpClient肯定是在request时进行处理的,你可以把这个验证码图片的链接显示在页面上,你前台输入验证码后再提交,这个时候request获取输入的验证码进行处理呀。[/quote] 嗯嗯恩, 我的方法是在loginservlet的doget()里生成验证码 , 然后在jsp里面img元素的src指向"loginservlet",表单的action是post,在doPost()里面处理,这样好像也可以,但是感觉逻辑怪怪的
NicholasYao 2014-11-03
  • 打赏
  • 举报
回复
引用 7 楼 crazypandariy 的回复:
服务器端获取到验证码图片后,保存,将图片的路径返回给浏览器,浏览器动态创建一个img元素并将src指向图片路径即可
嗯,这个保存跟将src指向图片路径是怎么实现的? 我的方法是在loginservlet的doget()里生成验证码 , 然后在jsp里面img元素的src指向"loginservlet",表单的action是post,在doPost()里面处理,这样好像也可以,但是感觉逻辑怪怪的
  • 打赏
  • 举报
回复
引用 2 楼 sinat_21607571 的回复:
[quote=引用 1 楼 littlebrain4solving 的回复:] 如果使用WEB应用的话,其实你可以不用使用HTTPClient来实现这个功能,当然如果你想这样做也是可以的。 你直接在Servlet的Init(初始化)方法中执行这个方法、你也可以发送一个request来执行这个方法;很多种方式 都可以执行你想要的内容。
想做成网页,不用httpclient还有什么可以来实现这个功能 然后这个登录是涉及到验证码的,登陆后抓取其他页面进行整理再返回给用户,每个用户都不同,在inti里面不合适吧,还有如果要在request里面实现要怎么操作[/quote] 你之所以使用HTTPClient同样是发一个请求到远程链接实现功能,你也同样可以用JavaScript的Ajax发送Post请求。
疯狂熊猫人 2014-11-02
  • 打赏
  • 举报
回复
服务器端获取到验证码图片后,保存,将图片的路径返回给浏览器,浏览器动态创建一个img元素并将src指向图片路径即可
wyx100 2014-11-02
  • 打赏
  • 举报
回复
引用 1 楼 littlebrain4solving 的回复:
如果使用WEB应用的话,其实你可以不用使用HTTPClient来实现这个功能,当然如果你想这样做也是可以的。 你直接在Servlet的Init(初始化)方法中执行这个方法、你也可以发送一个request来执行这个方法;很多种方式 都可以执行你想要的内容。
  • 打赏
  • 举报
回复
引用 4 楼 sinat_21607571 的回复:
[quote=引用 3 楼 littlebrain4solving 的回复:] [quote=引用 2 楼 sinat_21607571 的回复:] [quote=引用 1 楼 littlebrain4solving 的回复:] 如果使用WEB应用的话,其实你可以不用使用HTTPClient来实现这个功能,当然如果你想这样做也是可以的。 你直接在Servlet的Init(初始化)方法中执行这个方法、你也可以发送一个request来执行这个方法;很多种方式 都可以执行你想要的内容。
想做成网页,不用httpclient还有什么可以来实现这个功能 然后这个登录是涉及到验证码的,登陆后抓取其他页面进行整理再返回给用户,每个用户都不同,在inti里面不合适吧,还有如果要在request里面实现要怎么操作[/quote] 你之所以使用HTTPClient同样是发一个请求到远程链接实现功能,你也同样可以用JavaScript的Ajax发送Post请求。[/quote] 如果一定要用httpclient的话怎么处理验证码输入这个问题~[/quote] 如果是这样的话,你的HttpClient肯定是在request时进行处理的,你可以把这个验证码图片的链接显示在页面上,你前台输入验证码后再提交,这个时候request获取输入的验证码进行处理呀。
NicholasYao 2014-11-02
  • 打赏
  • 举报
回复
引用 3 楼 littlebrain4solving 的回复:
[quote=引用 2 楼 sinat_21607571 的回复:] [quote=引用 1 楼 littlebrain4solving 的回复:] 如果使用WEB应用的话,其实你可以不用使用HTTPClient来实现这个功能,当然如果你想这样做也是可以的。 你直接在Servlet的Init(初始化)方法中执行这个方法、你也可以发送一个request来执行这个方法;很多种方式 都可以执行你想要的内容。
想做成网页,不用httpclient还有什么可以来实现这个功能 然后这个登录是涉及到验证码的,登陆后抓取其他页面进行整理再返回给用户,每个用户都不同,在inti里面不合适吧,还有如果要在request里面实现要怎么操作[/quote] 你之所以使用HTTPClient同样是发一个请求到远程链接实现功能,你也同样可以用JavaScript的Ajax发送Post请求。[/quote] 如果一定要用httpclient的话怎么处理验证码输入这个问题~
NicholasYao 2014-11-02
  • 打赏
  • 举报
回复
引用 1 楼 littlebrain4solving 的回复:
如果使用WEB应用的话,其实你可以不用使用HTTPClient来实现这个功能,当然如果你想这样做也是可以的。 你直接在Servlet的Init(初始化)方法中执行这个方法、你也可以发送一个request来执行这个方法;很多种方式 都可以执行你想要的内容。
想做成网页,不用httpclient还有什么可以来实现这个功能 然后这个登录是涉及到验证码的,登陆后抓取其他页面进行整理再返回给用户,每个用户都不同,在inti里面不合适吧,还有如果要在request里面实现要怎么操作
  • 打赏
  • 举报
回复
如果使用WEB应用的话,其实你可以不用使用HTTPClient来实现这个功能,当然如果你想这样做也是可以的。 你直接在Servlet的Init(初始化)方法中执行这个方法、你也可以发送一个request来执行这个方法;很多种方式 都可以执行你想要的内容。

81,094

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧