浏览器与服务器交互原理以及用java模拟浏览器操作v
* 简单的讲,当浏览器向服务器发送Http请求的时候, HTTP服务器会产生一个SessionID,这个SessionID就唯一的标识了一个客户端到服务器的请求会话过程.
* 就如同一次会议开始时,主办方给每位到场的嘉宾一个临时的编号胸牌一样, 可以通过这个编号记录每个嘉宾(客户端)的活动(请求状态).
* 为了保持这个状态, 当服务端向客户端回应的时候,会附带Cookie信息,当然,Cookie里面就包含了SessionID
* 客户端在执行一系列操作时向服务端发送请求时,也会带上这个SessionID, 一般来说,Session也是一个URL QueryParameter ,就是说,session可以以Key-Value的形式通过URL传递
* 比如,http://www.51etest.com/dede/login.php?PHPSESSIONID=7dg3dsf19SDf73wqc32fdsf
* 一般而言,浏览器会自动把此Session信息放入Header报文体中进行传递.
* 如果浏览器不支持Cookie,那么,浏览器会自动把SessionID附加到URL中去.
*
* 2,在这个例子中,以登陆这个功能点进行讲解.
* 首先,我们登陆的页面是http://www.51etest.com/dede, 我们第一次访问这个页面后,可以从服务器过来的Http Response报文中的Header中找出服务器与浏览器向关联的数据 — Cookie,
* 而且Session的值也在Cookie中. 于是,我们可以通过分析Set-Cookie这个Header中的参数的值,找到Seesion的Key-Value段.
* 然后,我们再向服务器发送请求,请求URL为:post@@http://www.51etest.com/dede/login.php@@userid=admin&pwd=tidus2005&gotopage=/dede/&dopost=login
* 服务器验证登陆成功了, 并且在此次会话变量中增加了我们登陆成功的标识.
*
* 3,增加一个广告定义
* 增加一个广告定义其实就是一个添加数据的过程,无非是我们把我们要添加的数据通过参数的形式告诉指定url页面,页面获取后添加到数据库去而已.
* 此url地址为:
* post@@http://www.51etest.com/dede/ad_add.php@@dopost=save&tagname=test&typeid=0&adname=test&starttime=2008-05-29
* 因为这个页面会先判断我是否登陆
* 而判断的依据,前面讲了,就是根据我请求时的SessionID找到指定的Session数据区中是否存在我的登陆信息,
* 所以我当然要把访问登陆页面时获取的SessionID原封不动的再发回去
* 相当于对服务器说,这是我刚刚来时,你发我的临时身份证,我现在可以形势我的权利。
*
* 这就是整个Java后台登陆网站,然后添加数据的过程。
/**
*
*/
package sky.dong.test;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import org.apache.commons.httpclient.Cookie;
import org.apache.commons.httpclient.Header;
import org.apache.commons.httpclient.HttpClient;
import org.apache.commons.httpclient.NameValuePair;
import org.apache.commons.httpclient.cookie.CookiePolicy;
import org.apache.commons.httpclient.methods.PostMethod;
import org.apache.commons.httpclient.params.HttpMethodParams;
/**
* @author 核弹头
* Email:happyman_dong@sina.com 版权所有 盗版必究
* @since 2009-8-11
* @version 1.0
*/
public class HttpLoginTest {
public static void main(String[] args) {
String url = "http://discuzdemo.c88.53dns.com/logging.php?action=login&loginsubmit=yes&floatlogin=yes";//论坛的登陆页面
String url2="http://discuzdemo.c88.53dns.com/post.php?infloat=yes&action=newthread&fid=2&extra=&topicsubmit=yes&inajax=1";//论坛的发贴页面
HttpClient httpClient = new HttpClient();
//httpClient.getHostConfiguration().setProxy("222.247.62.195", 8080);
httpClient.getParams().setCookiePolicy(
CookiePolicy.BROWSER_COMPATIBILITY);
PostMethod postMethod = new PostMethod(url);
PostMethod postMethod2 = new PostMethod(url2);
NameValuePair[] data = {
new NameValuePair("username", "123"),
new NameValuePair("referer",
"http://discuzdemo.c88.53dns.com/index.php"),
new NameValuePair("password", "123"),
new NameValuePair("loginfield", "username"),
new NameValuePair("questionid", "0"),
new NameValuePair("formhash", "fc922ca7") };
postMethod.setRequestHeader("Referer",
"http://discuzdemo.c88.53dns.com/index.php");
postMethod.setRequestHeader("Host", "discuzdemo.c88.53dns.com");
// postMethod.setRequestHeader("Connection", "keep-alive");
// postMethod.setRequestHeader("Cookie", "jbu_oldtopics=D123D;
// jbu_fid2=1249912623; smile=1D1; jbu_onlineusernum=2;
// jbu_sid=amveZM");
postMethod
.setRequestHeader(
"User-Agent",
"Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.9.1.2) Gecko/20090729 Firefox/3.5.2");
postMethod
.setRequestHeader("Accept",
"text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8");
// postMethod.setRequestHeader("Accept-Encoding", "gzip,deflate");
// postMethod.setRequestHeader("Accept-Language", "zh-cn");
// postMethod.setRequestHeader("Accept-Charset",
// "GB2312,utf-8;q=0.7,*;q=0.7");
postMethod.setRequestBody(data);
try {
httpClient.executeMethod(postMethod);
StringBuffer response = new StringBuffer();
BufferedReader reader = new BufferedReader(new InputStreamReader(
postMethod.getResponseBodyAsStream(), "gb2312"));//以gb2312编码方式打印从服务器端返回的请求
String line;
while ((line = reader.readLine()) != null) {
response.append(line).append(
System.getProperty("line.separator"));
}
reader.close();
Header header = postMethod.getResponseHeader("Set-Cookie");
Cookie[] cookies=httpClient.getState().getCookies();//取出登陆成功后,服务器返回的cookies信息,里面保存了服务器端给的“临时证”
String tmpcookies="";
for(Cookie c:cookies){
tmpcookies=tmpcookies+c.toString()+";";
System.out.println(c);
}
System.out.println(tmpcookies);
// System.out.println(header.getValue());
System.out.println(response);
NameValuePair[] data2 = {
new NameValuePair("subject", "测试自动发贴"),
new NameValuePair("message",
"能否发贴成功呢?测试一下就知道了"),
new NameValuePair("updateswfattach", "0"),
new NameValuePair("wysiwyg", "0"),
new NameValuePair("checkbox", "0"),
new NameValuePair("handlekey", "newthread"),
new NameValuePair("formhash", "885493ec") };
postMethod2.setRequestHeader("cookie",tmpcookies);//将“临时证明”放入下一次的发贴请求操作中
postMethod2.getParams().setParameter(HttpMethodParams.HTTP_CONTENT_CHARSET, "gbk");//因为发贴时候有中文,设置一下请求编码
postMethod2.setRequestHeader("Referer",
"http://discuzdemo.c88.53dns.com/forumdisplay.php?fid=4");
postMethod2.setRequestHeader("Host", "discuzdemo.c88.53dns.com");
// postMethod.setRequestHeader("Connection", "keep-alive");
// postMethod.setRequestHeader("Cookie", "jbu_oldtopics=D123D;
// jbu_fid2=1249912623; smile=1D1; jbu_onlineusernum=2;
// jbu_sid=amveZM");
postMethod2
.setRequestHeader(
"User-Agent",
"Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.9.1.2) Gecko/20090729 Firefox/3.5.2");
postMethod2
.setRequestHeader("Accept",
"text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8");//以上操作是模拟浏览器的操作,使用服务器混淆
postMethod2.setRequestBody(data2);
httpClient.executeMethod(postMethod2);
StringBuffer response1 = new StringBuffer();
BufferedReader reader1 = new BufferedReader(new InputStreamReader(
postMethod2.getResponseBodyAsStream(), "gb2312"));
String line1;
while ((line1 = reader1.readLine()) != null) {
response1.append(line1).append(
System.getProperty("line.separator"));
}
reader1.close();
System.out.println(response1);
} catch (Exception e) {
System.out.println(e.getMessage());
// TODO: handle exception
} finally {
postMethod.releaseConnection();
postMethod2.releaseConnection();
}
}
}
飛奔嘅蝸牛
@Strong Yuan
浏览器与服务器交互原理以及用java模拟浏览器操作
Posted by strong on 2011/04/11 Leave a comment (0) Go to comments
* 1,在HTTP的WEB应用中, 应用客户端和服务器之间的状态是通过Session来维持的, 而Session的本质就是Cookie,
* 简单的讲,当浏览器向服务器发送Http请求的时候, HTTP服务器会产生一个SessionID,这个SessionID就唯一的标识了一个客户端到服务器的请求会话过程.
* 就如同一次会议开始时,主办方给每位到场的嘉宾一个临时的编号胸牌一样, 可以通过这个编号记录每个嘉宾(客户端)的活动(请求状态).
* 为了保持这个状态, 当服务端向客户端回应的时候,会附带Cookie信息,当然,Cookie里面就包含了SessionID
* 客户端在执行一系列操作时向服务端发送请求时,也会带上这个SessionID, 一般来说,Session也是一个URL QueryParameter ,就是说,session可以以Key-Value的形式通过URL传递
* 比如,http://www.51etest.com/dede/login.php?PHPSESSIONID=7dg3dsf19SDf73wqc32fdsf
* 一般而言,浏览器会自动把此Session信息放入Header报文体中进行传递.
* 如果浏览器不支持Cookie,那么,浏览器会自动把SessionID附加到URL中去.
*
* 2,在这个例子中,以登陆这个功能点进行讲解.
* 首先,我们登陆的页面是http://www.51etest.com/dede, 我们第一次访问这个页面后,可以从服务器过来的Http Response报文中的Header中找出服务器与浏览器向关联的数据 — Cookie,
* 而且Session的值也在Cookie中. 于是,我们可以通过分析Set-Cookie这个Header中的参数的值,找到Seesion的Key-Value段.
* 然后,我们再向服务器发送请求,请求URL为:post@@http://www.51etest.com/dede/login.php@@userid=admin&pwd=tidus2005&gotopage=/dede/&dopost=login
* 服务器验证登陆成功了, 并且在此次会话变量中增加了我们登陆成功的标识.
*
* 3,增加一个广告定义
* 增加一个广告定义其实就是一个添加数据的过程,无非是我们把我们要添加的数据通过参数的形式告诉指定url页面,页面获取后添加到数据库去而已.
* 此url地址为:
* post@@http://www.51etest.com/dede/ad_add.php@@dopost=save&tagname=test&typeid=0&adname=test&starttime=2008-05-29
* 因为这个页面会先判断我是否登陆
* 而判断的依据,前面讲了,就是根据我请求时的SessionID找到指定的Session数据区中是否存在我的登陆信息,
* 所以我当然要把访问登陆页面时获取的SessionID原封不动的再发回去
* 相当于对服务器说,这是我刚刚来时,你发我的临时身份证,我现在可以形势我的权利。
*
* 这就是整个Java后台登陆网站,然后添加数据的过程。
/**
*
*/
package sky.dong.test;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import org.apache.commons.httpclient.Cookie;
import org.apache.commons.httpclient.Header;
import org.apache.commons.httpclient.HttpClient;
import org.apache.commons.httpclient.NameValuePair;
import org.apache.commons.httpclient.cookie.CookiePolicy;
import org.apache.commons.httpclient.methods.PostMethod;
import org.apache.commons.httpclient.params.HttpMethodParams;
/**
* @author 核弹头
* Email:happyman_dong@sina.com 版权所有 盗版必究
* @since 2009-8-11
* @version 1.0
*/
public class HttpLoginTest {
public static void main(String[] args) {
String url = "http://discuzdemo.c88.53dns.com/logging.php?action=login&loginsubmit=yes&floatlogin=yes";//论坛的登陆页面
String url2="http://discuzdemo.c88.53dns.com/post.php?infloat=yes&action=newthread&fid=2&extra=&topicsubmit=yes&inajax=1";//论坛的发贴页面
HttpClient httpClient = new HttpClient();
//httpClient.getHostConfiguration().setProxy("222.247.62.195", 8080);
httpClient.getParams().setCookiePolicy(
CookiePolicy.BROWSER_COMPATIBILITY);
PostMethod postMethod = new PostMethod(url);
PostMethod postMethod2 = new PostMethod(url2);
NameValuePair[] data = {
new NameValuePair("username", "123"),
new NameValuePair("referer",
"http://discuzdemo.c88.53dns.com/index.php"),
new NameValuePair("password", "123"),
new NameValuePair("loginfield", "username"),
new NameValuePair("questionid", "0"),
new NameValuePair("formhash", "fc922ca7") };
postMethod.setRequestHeader("Referer",
"http://discuzdemo.c88.53dns.com/index.php");
postMethod.setRequestHeader("Host", "discuzdemo.c88.53dns.com");
// postMethod.setRequestHeader("Connection", "keep-alive");
// postMethod.setRequestHeader("Cookie", "jbu_oldtopics=D123D;
// jbu_fid2=1249912623; smile=1D1; jbu_onlineusernum=2;
// jbu_sid=amveZM");
postMethod
.setRequestHeader(
"User-Agent",
"Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.9.1.2) Gecko/20090729 Firefox/3.5.2");
postMethod
.setRequestHeader("Accept",
"text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8");
// postMethod.setRequestHeader("Accept-Encoding", "gzip,deflate");
// postMethod.setRequestHeader("Accept-Language", "zh-cn");
// postMethod.setRequestHeader("Accept-Charset",
// "GB2312,utf-8;q=0.7,*;q=0.7");
postMethod.setRequestBody(data);
try {
httpClient.executeMethod(postMethod);
StringBuffer response = new StringBuffer();
BufferedReader reader = new BufferedReader(new InputStreamReader(
postMethod.getResponseBodyAsStream(), "gb2312"));//以gb2312编码方式打印从服务器端返回的请求
String line;
while ((line = reader.readLine()) != null) {
response.append(line).append(
System.getProperty("line.separator"));
}
reader.close();
Header header = postMethod.getResponseHeader("Set-Cookie");
Cookie[] cookies=httpClient.getState().getCookies();//取出登陆成功后,服务器返回的cookies信息,里面保存了服务器端给的“临时证”
String tmpcookies="";
for(Cookie c:cookies){
tmpcookies=tmpcookies+c.toString()+";";
System.out.println(c);
}
System.out.println(tmpcookies);
// System.out.println(header.getValue());
System.out.println(response);
NameValuePair[] data2 = {
new NameValuePair("subject", "测试自动发贴"),
new NameValuePair("message",
"能否发贴成功呢?测试一下就知道了"),
new NameValuePair("updateswfattach", "0"),
new NameValuePair("wysiwyg", "0"),
new NameValuePair("checkbox", "0"),
new NameValuePair("handlekey", "newthread"),
new NameValuePair("formhash", "885493ec") };
postMethod2.setRequestHeader("cookie",tmpcookies);//将“临时证明”放入下一次的发贴请求操作中
postMethod2.getParams().setParameter(HttpMethodParams.HTTP_CONTENT_CHARSET, "gbk");//因为发贴时候有中文,设置一下请求编码
postMethod2.setRequestHeader("Referer",
"http://discuzdemo.c88.53dns.com/forumdisplay.php?fid=4");
postMethod2.setRequestHeader("Host", "discuzdemo.c88.53dns.com");
// postMethod.setRequestHeader("Connection", "keep-alive");
// postMethod.setRequestHeader("Cookie", "jbu_oldtopics=D123D;
// jbu_fid2=1249912623; smile=1D1; jbu_onlineusernum=2;
// jbu_sid=amveZM");
postMethod2
.setRequestHeader(
"User-Agent",
"Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.9.1.2) Gecko/20090729 Firefox/3.5.2");
postMethod2
.setRequestHeader("Accept",
"text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8");//以上操作是模拟浏览器的操作,使用服务器混淆
postMethod2.setRequestBody(data2);
httpClient.executeMethod(postMethod2);
StringBuffer response1 = new StringBuffer();
BufferedReader reader1 = new BufferedReader(new InputStreamReader(
postMethod2.getResponseBodyAsStream(), "gb2312"));
String line1;
while ((line1 = reader1.readLine()) != null) {
response1.append(line1).append(
System.getProperty("line.separator"));
}
reader1.close();
System.out.println(response1);
} catch (Exception e) {
System.out.println(e.getMessage());
// TODO: handle exception
} finally {
postMethod.releaseConnection();
postMethod2.releaseConnection();
}
}
}
浏览器与服务器交互原理以及用java模拟浏览器操作v的更多相关文章
- java模拟浏览器包selenium整合了htmlunit,火狐浏览器,IE浏览器,opare浏览器驱
//如果网页源码中有些内容是js渲染过来的,那你通过HttpClient直接取肯定取不到,但是这些数据一般都是通过异步请求传过来的(一般都是通过ajax的get或者post方式).那么你可以通过火狐浏 ...
- HTTP协议简介详解 HTTP协议发展 原理 请求方法 响应状态码 请求头 请求首部 java模拟浏览器客户端服务端
协议简介 协议,自然语言里面就是契约,也是双方或者多方经过协商达成的一致意见; 契约也即类似于合同,自然有甲方123...,乙方123...,哪些能做,哪些不能做; 通信协议,也即是双方通过网络通信必 ...
- Android开发中与服务器交互时,遇到java.io.IOException: Target host must not be null的问题
当我遇到这个问题的时候,也在网上查找好半天.找到了一个和这个问题很类似的问题——java.lang.IllegalStateException: Target host must not be nul ...
- spring 原理1:java 模拟springIOC容器
本篇博客主要是使用java代码模拟spring的IOC容器,实现依赖注入:当然只是模拟spring容器中简单的一点实现原理而已,加深一些自己对spring框架的底层原理的理解: 使用的技术:dom4j ...
- java模拟浏览器发送请求
package test; import java.io.BufferedReader; import java.io.DataOutputStream; import java.io.IOExcep ...
- java模拟浏览器上传文件
public static void main(String[] args) { String str = uploadFile("C:/Users/RGKY/Desktop/wKgBHVb ...
- java 模拟浏览器发送post请求
java使用URLConnection发送post请求 /** * 向指定 URL 发送POST方法的请求 * * @param url * 发送请求的 URL * @param param * 请求 ...
- java 模拟浏览器爬虫
- 浏览器和服务器实现跨域(CORS)判定的原理
前端对Cross-Origin Resource Sharing 问题(CORS,中文又称'跨域')应该很熟悉了.众所周知出于安全的考虑,浏览器有个同源策略,对于不同源的站点之间的相互请求会做限制(跨 ...
随机推荐
- web前端面试题HTML/CSS部分
web前端面试题HTML/CSS部分 前端页面有哪三层构成,分别是什么?作用是什么? 1.结构层:由 HTML 或 XHTML 之类的标记语言负责创建,仅负责语义的表达.解决了页面“内容是什么”的问题 ...
- C#关键字as出现的错误
ObjectCache cache = MemoryCache.Default; string cacheData1 = cache["key1"] as string;//得不到 ...
- 学JS的心路历程 - PixiJS -基础(三)
今天我们来试着移动图片吧! 首先,一样先把图片放到PIXI的stage中: let app = new PIXI.Application({ width: 800, height: 600, back ...
- ADO.Net 数据库 删除
删除数据库里的信息和之前增加,修改大同小异,其写法更加简单,也是把SQL语句写为删除语句 删除一条数据,只需要获取并接收到这条数据唯一的能够代表这条数据的信息,比如主键 代码演示: using Sys ...
- NFS 网络文件系统制作
1. 构建根文件系统主要是建立相关的文件目录,以及各目录下相关的配置文件.管理工具等. 2. 首先创建文件目录. mkdir rootfs cd rootfs mkdir bin dev etc li ...
- akka共享内存
Akka共享内存 Akka中的共享内存是基于Actor模型的,Actor模型提倡的是:通过通讯来实现共享内存,而不是用共享内存来实现通讯,这点是跟Java解决共享内存最大的区别,举个例子: 在Java ...
- 1.3.1、CDH 搭建Hadoop在安装之前(端口---Cloudera Manager和Cloudera Navigator使用的端口)
下图概述了Cloudera Manager,Cloudera Navigator和Cloudera Management Service角色使用的一些端口: Cloudera Manager和Clou ...
- cdnbest如何查看站点操作日志(同步日志)
1. 在区域列表点同步日志 2. 点击进入后,可以查看对哪个站点进行了操作,操作时间,ip,id都有记录 3. 想知道详细操作了什么内容把鼠标指向操作类型,就会弹出操作的信息
- Spring mvc接收中文参数值乱码(tomcat配置问题)
问题| 使用java写的接口,中文参数乱码 问题分析| 请求方打印参数日志,中文无问题,tomcat中日志显示接收的参数乱码 实际是tomcat配置问题 解决方法| 在tomcat的配置文 ...
- 搭建harbor仓库、LDAP认证
ldap: 192.168.199.177 c5game.com 宿主机:192.168.199.224 测试客户机:192.168.199.223 安装docker.docker-compose 访 ...