C#网站登录学习笔记(二):访问需登录后才能访问的页面
上一篇笔记:C#网站登录学习笔记(一):登录简单网站
在上篇笔记中,描述了在C#中如何使用HttpWebRequest、HttpWebResponse登录简单网站,但如果用同样的方法去访问一个需要登录后才能访问的页面,会出现什么结果呢?让我们先来尝试一下!
尝试一:在上篇笔记中,创建了一个用于测试的简单网站,其中LoginSuccess.aspx页面是需要登录后才能访问的(没登录的用户访问该页面,会被重定向到default.aspx页面)。这里我们调用GetHtml("http://localhost/TestLogin/LoginSuccess.aspx")来直接访问LoginSuccess.aspx页面,同时用HTTP Analyzer抓包:
(图一)
从抓包截图(图一)上可以看到,当程序访问LoginSuccess.aspx页面时,被重定向到default.aspx页面去了,证明不能直接访问。
尝试二:那么是不是用程序先在defaul.aspx中登录后在访问LoginSuccess.aspx页面就OK了呢?我们再来尝试一下:1. 调用GetHtml("http://localhost/TestLogin/Default.aspx", postData, Method.POST)登录;2.调用GetHtml("http://localhost/TestLogin/LoginSuccess.aspx")访问LoginSuccess.aspx页面。
(图二)
图二是第二次尝试中庸HTTP Analyzer抓包的截图。1、2:程序在Default.aspx中登录成功后,自动跳转至LoginSuccess.aspx;3、4:程序在登录成功后,访问LoginSuccess.aspx页面,被重定向到Default.aspx。看来这次的尝试又失败了。
然道没办法在程序中访问需登录后才能访问的页面了吗?答案是否定的!那么该如何实现呢?在实现前,有一些基础知识是要先了解的:
哈哈,原来是Cookie的原因啊!看来我们只需在访问需登录的页面时把该网站对应的Cookie带上就OK了。这里使用CookieContainer来保存Cookie。
尝试三:给HttpWebRequest指定CookieContainer,登录并访问LoginSuccess.aspx页面。
以下是修改后的代码:
// 登录网站
HttpWebRequest loginHttpWebRequest = (HttpWebRequest)HttpWebRequest.Create("http://localhost/TestLogin/Default.aspx");
loginHttpWebRequest.CookieContainer = cookieContainer; // 给HttpWebRequest指定CookieContainer
byte[] byteRequest = Encoding.Default.GetBytes(postData);
loginHttpWebRequest.ContentType = contentType;
loginHttpWebRequest.Referer = "http://localhost/TestLogin/Default.aspx";
loginHttpWebRequest.Accept = accept;
loginHttpWebRequest.UserAgent = userAgent;
loginHttpWebRequest.Method = "POST";
loginHttpWebRequest.ContentLength = byteRequest.Length;
Stream stream = loginHttpWebRequest.GetRequestStream();
stream.Write(byteRequest, 0, byteRequest.Length);
stream.Close();
loginHttpWebRequest.GetResponse();
// 访问LoginSuccess.aspx
HttpWebRequest httpWebRequest = (HttpWebRequest)HttpWebRequest.Create("http://localhost/TestLogin/LoginSuccess.aspx");
httpWebRequest.CookieContainer = cookieContainer; // 给HttpWebRequest指定CookieContainer
httpWebRequest.GetResponse();
下图是抓包截图:
(图三)
注意和图二的区别,少了个“4”,这就说明:程序成功访问了需登录后才能访问的页面LoginSuccess.aspx。
点击下载示例代码(VS2008)