zoukankan      html  css  js  c++  java
  • 利用HttpWebReuest获取需要身份验证的页面信息(转)

    原文:http://www.cnblogs.com/tianfang/archive/2007/09/01/878545.html


    我们用HttpWebRequest获取页面时,有的页面需要登录后才能获取。在大部分的web程序中,是用cookie来保存用户信息的,只要在发送WebRequest的时候附上用户的cookie信息,就可以很容易的获取到需要身份验证的页面信息了(本文也只讨论这种情况)。

    方式如下:

    HttpWebRequest req = (HttpWebRequest)WebRequest.Create(url);
    req.AllowAutoRedirect = false; //
    禁止自动重定向
    string cookieinfo = "Cookie: .ASPXAUTH=12EB2C50";
    req.Headers.Add(cookieinfo);

    可能有人会问第三行的cookieinfo是如何获取的,非常简单,首先用ie登录,登录时选取记住我的密码选项(大部分页面都有这种选项)。然后用ie登录你想要获取的页面url,同时监控ie的http头信息,从中即可找到类似"Cookie: .ASPXAUTH=12EB2C50"的选项,这个就是cookie的信息了,只要在你的WebRequest的头中加上如此信息即可。

    注意代码中的第二行:
    req.AllowAutoRedirect = false; //禁止自动重定向

    该代码的作用是禁止自动重定向,如果没有该选项可能导致获取的页面是重定向的页面,而不是你要的页面。

    这种方法简单易行。然而,有的页面无法记住密码选项,并且cookie比较容易失效。用ie获取的cookie很难供HttpWebReuest使用,这时就需要用HttpWebReuest来进行登录操作,从而获取该session的cookie。

    登录方式如下:

    HttpWebRequest reqlog = (HttpWebRequest)WebRequest.Create("http://localhost:2565/AspStudy/login.aspx");
    //
    开启cookie以启用session
    reqlog.CookieContainer = new CookieContainer();

    reqlog.AllowAutoRedirect = false; //
    禁止自动重定向
    reqlog.ServicePoint.Expect100Continue = false; //禁止100Continue

    reqlog.Method = "POST";
    reqlog.KeepAlive = true;
    reqlog.ContentType = "application/x-www-form-urlencoded";
    //req.UserAgent = "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 2.0.50727)";

    //
    此处post的信息格式可以通过httplook来得到
    string info = "user=usr pwd=123";
    byte[] loginfo = Encoding.ASCII.GetBytes(info);
    //reqlog.ContentLength = loginfo.Length;
    Stream reqStream = reqlog.GetRequestStream();
    reqStream.Write(loginfo, 0, loginfo.Length);
    reqStream.Close();

    HttpWebResponse resp = reqlog.GetResponse() as HttpWebResponse;
    Console.WriteLine(resp.Headers.ToString());
    //
    判断是否登陆成功
    if (resp.StatusCode != HttpStatusCode.Found)
    {
        throw new Exception("login fail");
    }

    //
    维持登陆时的session
    req.CookieContainer = reqlog.CookieContainer;

    reqlog用来登录,这里的代码只是一个实例,不同的网站采用了不同的方式登录,仍然需要通过抓包来获取登录的具体方式。

    如果reqlog登录成功,reqlog中的CookieContainer便保存了cookie信息,在新的request中使用该CookieContainer即可维持session状态,也就可以获取用户登录后的页面信息了。

    上述代码中有这样一行:
    reqlog.ServicePoint.Expect100Continue = false; //禁止100Continue

    该行作用是不响应100号应答,如果不进行该项设置可能导致一次性post不成功,需要在100应答后才发送post数据,比较麻烦。

  • 相关阅读:
    怎样获取当前文档的域名
    怎样获取当前网页的URL
    怎样获取所有style节点
    怎样获取所有的script节点
    怎样获取所有的embed节点对象
    怎样获取页面中的所有图片节点
    怎样获取页面中的表单元素节点
    怎样获取页面中所有带href属性的标签集合
    怎样获取当前页面内的全屏状态的元素节点
    怎样获取当前页面的焦点聚焦元素节点
  • 原文地址:https://www.cnblogs.com/gxh973121/p/1139699.html
Copyright © 2011-2022 走看看