用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

相关文章

【C++】_list常用方法解析及模拟实现

相信自己的力量,只要对自己始终保持信心,尽自己最大努力去完成任何事,就算事情最终结果是失败了,努力了也不留遗憾。💓💓💓 目录   ✨说在前面 🍋知识点一:什么是list? •🌰1.list的定义 •🌰2.list的基本特性 •🌰3.常用接口介绍 🍋知识点二:list常用接口 •🌰1.默认成员函数 🔥构造函数(⭐) 🔥析构函数 •🌰2.list对象

usaco 1.2 Transformations(模拟)

我的做法就是一个一个情况枚举出来 注意计算公式: ( 变换后的矩阵记为C) 顺时针旋转90°:C[i] [j]=A[n-j-1] [i] (旋转180°和270° 可以多转几个九十度来推) 对称:C[i] [n-j-1]=A[i] [j] 代码有点长 。。。 /*ID: who jayLANG: C++TASK: transform*/#include<

hdu4431麻将模拟

给13张牌。问增加哪些牌可以胡牌。 胡牌有以下几种情况: 1、一个对子 + 4组 3个相同的牌或者顺子。 2、7个不同的对子。 3、13幺 贪心的思想: 对于某张牌>=3个,先减去3个相同,再组合顺子。 import java.io.BufferedInputStream;import java.io.BufferedReader;import java.io.IOExcepti

bytes.split的用法和注意事项

当然,我很乐意详细介绍 bytes.Split 的用法和注意事项。这个函数是 Go 标准库中 bytes 包的一个重要组成部分,用于分割字节切片。 基本用法 bytes.Split 的函数签名如下: func Split(s, sep []byte) [][]byte s 是要分割的字节切片sep 是用作分隔符的字节切片返回值是一个二维字节切片,包含分割后的结果 基本使用示例: pa

【每日一题】LeetCode 2181.合并零之间的节点(链表、模拟)

【每日一题】LeetCode 2181.合并零之间的节点(链表、模拟) 题目描述 给定一个链表,链表中的每个节点代表一个整数。链表中的整数由 0 分隔开,表示不同的区间。链表的开始和结束节点的值都为 0。任务是将每两个相邻的 0 之间的所有节点合并成一个节点,新节点的值为原区间内所有节点值的和。合并后,需要移除所有的 0,并返回修改后的链表头节点。 思路分析 初始化:创建一个虚拟头节点

速盾高防cdn是怎么解决网站攻击的?

速盾高防CDN是一种基于云计算技术的网络安全解决方案,可以有效地保护网站免受各种网络攻击的威胁。它通过在全球多个节点部署服务器,将网站内容缓存到这些服务器上,并通过智能路由技术将用户的请求引导到最近的服务器上,以提供更快的访问速度和更好的网络性能。 速盾高防CDN主要采用以下几种方式来解决网站攻击: 分布式拒绝服务攻击(DDoS)防护:DDoS攻击是一种常见的网络攻击手段,攻击者通过向目标网

每日一题|牛客竞赛|四舍五入|字符串+贪心+模拟

每日一题|四舍五入 四舍五入 心有猛虎,细嗅蔷薇。你好朋友,这里是锅巴的C\C++学习笔记,常言道,不积跬步无以至千里,希望有朝一日我们积累的滴水可以击穿顽石。 四舍五入 题目: 牛牛发明了一种新的四舍五入应用于整数,对个位四舍五入,规则如下 12345->12350 12399->12400 输入描述: 输入一个整数n(0<=n<=109 ) 输出描述: 输出一个整数

【算法专场】模拟(下)

目录 前言 38. 外观数列 算法分析 算法思路 算法代码 1419. 数青蛙 算法分析 算法思路 算法代码  2671. 频率跟踪器 算法分析 算法思路 算法代码 前言 在前面我们已经讲解了什么是模拟算法,这篇主要是讲解在leetcode上遇到的一些模拟题目~ 38. 外观数列 算法分析 这道题其实就是要将连续且相同的字符替换成字符重复的次数+

49个权威的网上学习资源网站

艺术与音乐 Dave Conservatoire — 一个完全免费的音乐学习网站,口号是“让每一个人都可以接受世界级的音乐教育”,有视频,有练习。 Drawspace — 如果你想学习绘画,或者提高自己的绘画技能,就来Drawspace吧。 Justin Guitar — 超过800节免费的吉他课程,有自己的app,还有电子书、DVD等实用内容。 数学,数据科学与工程 Codecad

模拟实现vector中的常见接口

insert void insert(iterator pos, const T& x){if (_finish == _endofstorage){int n = pos - _start;size_t newcapacity = capacity() == 0 ? 2 : capacity() * 2;reserve(newcapacity);pos = _start + n;//防止迭代