* 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();
}
}
}
飛奔嘅蝸牛
@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();
}
}
}
* 簡單的講,當瀏覽器向服務器發送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();
}
}
}