原文下载:http://www.ziddu.com/download/3923096/3.doc.html
问题描述:
自动登录校内网,并发布博客文章。
难点:
HTTP是无状态协议,如何在多个HTTP请求之间进行状态保持?
说明:
本次实验是在前两次实验的基础之上,假定同学们已经能够用代码实现前两次实验的功能(访问页面和发送数据)。这次实验比前两次实验的所增加的知识点在于状态保持,也就是,登录后,如何保持Cookie和Session,从而发布文章时,让服务器以为你是已登录用户。
具体实现:
1.首先进行抓包分析。需要分析两次HTTP包,即登录包和发布文章包。
(1)打开校内网,找到登录页面进行登录,并抓包分析。
http://login.xiaonei.com/Login.do
(2)找到发表博客的页面,发布一篇新的日志,并抓包分析。
http://blog.xiaonei.com/NewEntry.do
通过理论课所讲知识可知,服务器端利用Session实现状态保持,而这个Session是通过存在浏览器端的一个Cookie进行识别的,在抓包时可以注意这个Cookie。
2.用代码实现
编码格式:UTF-8
代码实现的两个任务是:一是发一个登录的包,并保存服务器端返回的Cookie。二是再发送一个发布文章的包,同时注意把上一步保存的Cookie也发送出去。
关键代码:
Java版
片断1
HttpClient client=new HttpClient();
PostMethod post=new UTF8PostMethod("http://login.xiaonei.com/Login.do");
post.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
//下面这条代码可以实现自动保存Cookie
client.getParams().setCookiePolicy(CookiePolicy.BROWSER_COMPATIBILITY);
片断2
post.setRequestBody(data); //设置要发送的数据(登录信息)
client.executeMethod(post); //发送登录请求
C#版
片断1
HttpWebRequest request = (HttpWebRequest)WebRequest.Create("http://login.xiaonei.com/Login.do");
request.Method="POST";
request.Cookies=new CookieContainer();
片断2
request.ContentLength = data.Length;
request.ContentType = "application/x-www-form-urlencoded";
request.GetRequestStream().Write(data, 0, data.Length); //设置要发送的数据(登录信息)
片断3
CookieContainer cookies = request.CookieContainer; //保存Cookie
片断4
//下面这些代码生成一个新的POST请求(发布文章),并设置其Cookie为在上一步所保存的Cookie
request = (HttpWebRequest)WebRequest.Create("http://blog.xiaonei.com/NewEntry.do");
request.CookieContainer = cookies;
问题描述:
自动登录校内网,并发布博客文章。
难点:
HTTP是无状态协议,如何在多个HTTP请求之间进行状态保持?
说明:
本次实验是在前两次实验的基础之上,假定同学们已经能够用代码实现前两次实验的功能(访问页面和发送数据)。这次实验比前两次实验的所增加的知识点在于状态保持,也就是,登录后,如何保持Cookie和Session,从而发布文章时,让服务器以为你是已登录用户。
具体实现:
1.首先进行抓包分析。需要分析两次HTTP包,即登录包和发布文章包。
(1)打开校内网,找到登录页面进行登录,并抓包分析。
http://login.xiaonei.com/Login.do
(2)找到发表博客的页面,发布一篇新的日志,并抓包分析。
http://blog.xiaonei.com/NewEntry.do
通过理论课所讲知识可知,服务器端利用Session实现状态保持,而这个Session是通过存在浏览器端的一个Cookie进行识别的,在抓包时可以注意这个Cookie。
2.用代码实现
编码格式:UTF-8
代码实现的两个任务是:一是发一个登录的包,并保存服务器端返回的Cookie。二是再发送一个发布文章的包,同时注意把上一步保存的Cookie也发送出去。
关键代码:
Java版
片断1
HttpClient client=new HttpClient();
PostMethod post=new UTF8PostMethod("http://login.xiaonei.com/Login.do");
post.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
//下面这条代码可以实现自动保存Cookie
client.getParams().setCookiePolicy(CookiePolicy.BROWSER_COMPATIBILITY);
片断2
post.setRequestBody(data); //设置要发送的数据(登录信息)
client.executeMethod(post); //发送登录请求
C#版
片断1
HttpWebRequest request = (HttpWebRequest)WebRequest.Create("http://login.xiaonei.com/Login.do");
request.Method="POST";
request.Cookies=new CookieContainer();
片断2
request.ContentLength = data.Length;
request.ContentType = "application/x-www-form-urlencoded";
request.GetRequestStream().Write(data, 0, data.Length); //设置要发送的数据(登录信息)
片断3
CookieContainer cookies = request.CookieContainer; //保存Cookie
片断4
//下面这些代码生成一个新的POST请求(发布文章),并设置其Cookie为在上一步所保存的Cookie
request = (HttpWebRequest)WebRequest.Create("http://blog.xiaonei.com/NewEntry.do");
request.CookieContainer = cookies;