用httpclient模拟登陆网站注意事项

2024-06-22 05:48

本文主要是介绍用httpclient模拟登陆网站注意事项,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

最近一直在用httpclient进行模拟登陆网站,即先用httpwatch记录手动登陆时浏览器与服务器之间的数据交互,然后用httpclient模拟浏览器的行为进行登陆。

但是一开始进行模拟时总是登陆不成功,即使发送的内容与httpwatch中记录的内容一致时,也是返回不了正确的结果,经过网上搜索和尝试,发现是发送请求时,请求头的信息不够完整。同样的请求体,如果把请求头的信息尽量完善,就能够成功登陆,否则则是登陆失败。

其次还要注意第一次向服务器请求时,服务器一般都会返回一个“Set-Cookie”字段,把这个字段中的内容(如sessionid)记录下来,添加到cookie中,再次向服务器发请求时带上cookie,这样就能有很大概率登陆成功了。

下面是一个模拟登陆的代码,其中包括对于验证码的处理

public static void main(String[] args) throws HttpException, IOException {HttpClient client = new HttpClient();String url = "http://www.xxxxx.com/user/login.html";GetMethod getMethod = new GetMethod(url);getMethod.setRequestHeader("Host", "www.xxxxxx.com");  getMethod.setRequestHeader("User-Agent", "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; WOW64; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; NP06; .NET4.0C; .NET4.0E; InfoPath.3; Media Center PC 6.0)");  getMethod.setRequestHeader("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8");  getMethod.setRequestHeader("Accept-Language", "zh-cn,zh;q=0.5");  getMethod.setRequestHeader("Accept-Charset", "GB2312,utf-8;q=0.7,*;q=0.7");  getMethod.setRequestHeader("Connection", "keep-alive");  getMethod.setRequestHeader("Cache-Control", "max-age=0");client.executeMethod(getMethod);Header header = getMethod.getResponseHeader("Set-cookie");//记录服务器返回的cookie值   System.out.println(header.getValue());  String headerCookie = header.getValue();  String SessionId = headerCookie.substring(headerCookie.indexOf("ASP.NET_SessionId=") + "ASP.NET_SessionId=".length(), headerCookie.indexOf(";"));  System.out.println(SessionId); StringBuffer sb = new StringBuffer();sb.append("Hm_lvt_ebd37b04edd1e0fceaa52dc641b8ff6f=1412760752,1412820282; sgsa_id=anxin.com|1412760752435322; _ga=GA1.2.1171830066.1412760753; cuuid=E407DF6BFFBF4599; _gat=1; Hm_lpvt_ebd37b04edd1e0fceaa52dc641b8ff6f=1412820282; sgsa_vt_187935_192889=1412820281676; CNZZDATA1252986781=736053870-1412760776-%7C1412820303; dntadmin=;");sb.append("ASP.NET_SessionId=").append(SessionId).append("; ");String cookie = sb.toString();System.out.println(cookie);getMethod = new GetMethod("http://www.xxxxxx.com/vcode.aspx?xxxx=xxxxx&x=x");//获取验证码client.executeMethod(getMethod);InputStream is = getMethod.getResponseBodyAsStream();File file = new File("D:/image.png");//图片格式根据具体情况而定(有些网站在获取验证码时也要发送带cookie的请求头,要注意具体情况具体分析)FileOutputStream fos = new FileOutputStream(file);byte b[] = new byte[1024];int j = 0;while((j=is.read(b))!=-1){fos.write(b, 0, j);}fos.flush();fos.close();String key = "";System.out.println("请输入验证码");Scanner scanner = new Scanner(System.in);key = scanner.nextLine();client.getHostConfiguration().setHost("www.xxxxxx.com", 80, "http");  PostMethod method = getPostMethod(key);  method.setRequestHeader("User-Agent", "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; WOW64; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; NP06; .NET4.0C; .NET4.0E; InfoPath.3; Media Center PC 6.0)");  method.setRequestHeader("Host", "www.xxxxxx.com");  method.setRequestHeader("Accept", "application/json, text/javascript, */*");  method.setRequestHeader("Accept-Language", "zh-cn,zh;q=0.5");  
//      method.setRequestHeader("Accept-Encoding", "gzip, deflate");  method.setRequestHeader("Accept-Charset", "GB2312,utf-8;q=0.7,*;q=0.7");  method.setRequestHeader("Connection", "keep-alive");  method.setRequestHeader("Content-Type", "application/x-www-form-urlencoded; charset=UTF-8");  method.setRequestHeader("X-Requested-With", "XMLHttpRequest");  method.setRequestHeader("Referer", "http://www.xxxxxx.com/user/login.html");  method.setRequestHeader("Cookie", cookie);   client.executeMethod(method);  System.out.println(method.getStatusCode());  System.out.println(method.getResponseBodyAsString());Header header1 = method.getResponseHeader("Set-cookie");   sb.append(header1.getValue());  Cookie[] cookies = client.getState().getCookies();  method.releaseConnection();  String my = "http://www.xxxxx.com/usercenter";  System.out.println(sb.toString());  getMethod = new GetMethod(my);  getMethod.setRequestHeader("Host", "www.xxxxx.com");  getMethod.setRequestHeader("User-Agent", "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; WOW64; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; NP06; .NET4.0C; .NET4.0E; InfoPath.3; Media Center PC 6.0)");  getMethod.setRequestHeader("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8");  getMethod.setRequestHeader("Accept-Language", "zh-cn,zh;q=0.5");  getMethod.setRequestHeader("Accept-Charset", "GB2312,utf-8;q=0.7,*;q=0.7");  getMethod.setRequestHeader("Connection", "keep-alive");  getMethod.setRequestHeader("Referer", "http://www.xxxxx.com/user/login.html");  getMethod.setRequestHeader("Cookie", sb.toString());  int code = client.executeMethod(getMethod);  System.out.println(getMethod.getStatusCode());  System.out.println(getMethod.getResponseBodyAsString());  }private static PostMethod getPostMethod(String ValidCode) {  PostMethod post = new PostMethod("/ajax/xxxx.xxxx");  NameValuePair[] simcard = {  new NameValuePair("Action", "post"),  new NameValuePair("Keep", "0"),  new NameValuePair("sPassword", "xxxxx"),  new NameValuePair("sUserName", "xxxxx"),  new NameValuePair("sVerCode", ValidCode),  };  post.setRequestBody(simcard);  return post;  } 


这篇关于用httpclient模拟登陆网站注意事项的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1083465

相关文章

Java 方法重载Overload常见误区及注意事项

《Java方法重载Overload常见误区及注意事项》Java方法重载允许同一类中同名方法通过参数类型、数量、顺序差异实现功能扩展,提升代码灵活性,核心条件为参数列表不同,不涉及返回类型、访问修饰符... 目录Java 方法重载(Overload)详解一、方法重载的核心条件二、构成方法重载的具体情况三、不构

Go语言中nil判断的注意事项(最新推荐)

《Go语言中nil判断的注意事项(最新推荐)》本文给大家介绍Go语言中nil判断的注意事项,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录1.接口变量的特殊行为2.nil的合法类型3.nil值的实用行为4.自定义类型与nil5.反射判断nil6.函数返回的

MySQL 获取字符串长度及注意事项

《MySQL获取字符串长度及注意事项》本文通过实例代码给大家介绍MySQL获取字符串长度及注意事项,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录mysql 获取字符串长度详解 核心长度函数对比⚠️ 六大关键注意事项1. 字符编码决定字节长度2

C++链表的虚拟头节点实现细节及注意事项

《C++链表的虚拟头节点实现细节及注意事项》虚拟头节点是链表操作中极为实用的设计技巧,它通过在链表真实头部前添加一个特殊节点,有效简化边界条件处理,:本文主要介绍C++链表的虚拟头节点实现细节及注... 目录C++链表虚拟头节点(Dummy Head)一、虚拟头节点的本质与核心作用1. 定义2. 核心价值二

详解MySQL中DISTINCT去重的核心注意事项

《详解MySQL中DISTINCT去重的核心注意事项》为了实现查询不重复的数据,MySQL提供了DISTINCT关键字,它的主要作用就是对数据表中一个或多个字段重复的数据进行过滤,只返回其中的一条数据... 目录DISTINCT 六大注意事项1. 作用范围:所有 SELECT 字段2. NULL 值的特殊处

MySQL 打开binlog日志的方法及注意事项

《MySQL打开binlog日志的方法及注意事项》本文给大家介绍MySQL打开binlog日志的方法及注意事项,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要... 目录一、默认状态二、如何检查 binlog 状态三、如何开启 binlog3.1 临时开启(重启后失效)

Java使用HttpClient实现图片下载与本地保存功能

《Java使用HttpClient实现图片下载与本地保存功能》在当今数字化时代,网络资源的获取与处理已成为软件开发中的常见需求,其中,图片作为网络上最常见的资源之一,其下载与保存功能在许多应用场景中都... 目录引言一、Apache HttpClient简介二、技术栈与环境准备三、实现图片下载与保存功能1.

Python使用pynput模拟实现键盘自动输入工具

《Python使用pynput模拟实现键盘自动输入工具》在日常办公和软件开发中,我们经常需要处理大量重复的文本输入工作,所以本文就来和大家介绍一款使用Python的PyQt5库结合pynput键盘控制... 目录概述:当自动化遇上可视化功能全景图核心功能矩阵技术栈深度效果展示使用教程四步操作指南核心代码解析

如何关闭Mac的Safari通知? 3招教你关闭Safari浏览器网站通知的技巧

《如何关闭Mac的Safari通知?3招教你关闭Safari浏览器网站通知的技巧》当我们在使用Mac电脑专注做一件事情的时候,总是会被一些消息推送通知所打扰,这时候,我们就希望关闭这些烦人的Mac通... Safari 浏览器的「通知」功能本意是为了方便用户及时获取最新资讯,但很容易被一些网站滥用,导致我们

Python模拟串口通信的示例详解

《Python模拟串口通信的示例详解》pySerial是Python中用于操作串口的第三方模块,它支持Windows、Linux、OSX、BSD等多个平台,下面我们就来看看Python如何使用pySe... 目录1.win 下载虚www.chinasem.cn拟串口2、确定串口号3、配置串口4、串口通信示例5