在WebBrowser下对网页进行操作其实是一件挺轻松的事情,他可以很方便实现自定义的网站访问习惯。而WebBrowser毕竟是对MS原生控件的封装,当我们使用C#下的WebBrowser尤其是这样,虽然他可以更方便大家去调用,但是他的方便却是牺牲了灵活性为代价的。
有一天我想使用WebBrowser获取一个网站的COOKIE,在调用Document.Cookie时,发现无法完整获取其COOKIE,百思不得其解,这么简单的功能,WebBrowser也会秀逗。经过抓包分析,发现原来该网站对写入到用户端关键的Cookie,加入httponly
HttpOnly,其实是一个提高WEB网站应用程序安全性的一个功能,但是大家往往都把他给忽略掉了。比如在ASP.NET 2.0的web.config的配制文件里就提供这个子的设置
1 <httpCookies httpOnlyCookies="true" /> 2 // ***********.NET的代码如: 3 HttpCookie myCookie = new HttpCookie("myCookie"); 4 myCookie.HttpOnly = true; 5 Response.AppendCookie(myCookie); 就是这个小小的设置,令WebBrowser拿他却是没辙,查了大量资料,要想实现这个功能,一定需要实现对最原始的网络流的读写,这种方法对很多程序员来说实现难度太大了。下面就教大家实现一个很简单的实现方法 1 public string Cookie() 2 { 3 if (this.Url == null) 4 return null; 5 string dir = this.Url.Host; 6 FileStream fr = new FileStream(Environment.GetFolderPath(Environment.SpecialFolder.Cookies) + "\\index.dat", FileMode.Open, FileAccess.Read, FileShare.ReadWrite); 7 byte[] __dat = new byte[(int)fr.Length]; 8 fr.Read(__dat, 0, __dat.Length); 9 fr.Close(); 10 fr.Dispose(); 11 string __datstream = Encoding.Default.GetString(__dat); 12 int p1 = 0; 13 p1 = __datstream.IndexOf("@" + dir, p1); 14 if (p1 == -1) 15 p1 = __datstream.IndexOf("@" + dir.Substring(dir.IndexOf('.') + 1)); 16 if (p1 == -1) 17 return this.Document.Cookie; 18 int p2 = __datstream.IndexOf(".txt", p1 + 1); 19 p1 = __datstream.LastIndexOf('@', p2); 20 string dm = __datstream.Substring(p1 + 1, p2 - p1 + 3).TrimStart('?'); 21 p1 = __datstream.LastIndexOf(":", p1); 22 p2 = __datstream.IndexOf('@', ++p1); 23 __datstream = string.Format("{0}@{1}", __datstream.Substring(p1, p2 - p1), dm); 24 25 Dictionary<string, string> __cookiedicts = new Dictionary<string, string>(); 26 string __n; 27 StringBuilder __cookies = new StringBuilder(); 28 __datstream = File.ReadAllText(Environment.GetFolderPath(Environment.SpecialFolder.Cookies) + "\\" + __datstream, Encoding.Default); 29 p1 = -2; 30 do 31 { 32 p1 += 2; 33 p2 = __datstream.IndexOf('\n', p1); 34 if (p2 == -1) 35 break; 36 __n = __datstream.Substring(p1, p2 - p1); 37 p1 = p2 + 1; 38 p2 = __datstream.IndexOf('\n', p1); 39 if (!__cookiedicts.ContainsKey(__n)) 40 __cookiedicts.Add(__n, __datstream.Substring(p1, p2 - p1)); 41 } 42 while ((p1 = __datstream.IndexOf("*\n", p1)) > -1); 43 if (this.Document.Cookie != null && this.Document.Cookie.Length > 0) 44 { 45 foreach (string s in this.Document.Cookie.Split(';')) 46 { 47 p1 = s.IndexOf('='); 48 if (p1 == -1) 49 continue; 50 __datstream = s.Substring(0, p1).TrimStart(); 51 if (__cookiedicts.ContainsKey(__datstream)) 52 __cookiedicts[__datstream] = s.Substring(p1 + 1); 53 else 54 __cookiedicts.Add(__datstream, s.Substring(p1 + 1)); 55 } 56 } 57 foreach (string s in __cookiedicts.Keys) 58 { 59 if (__cookies.Length > 0) 60 __cookies.Append(';'); 61 __cookies.Append(s); 62 __cookies.Append('='); 63 __cookies.Append(__cookiedicts[s]); 64 } 65 return __cookies.ToString(); 66 } 以上为你介绍的是C#利用WebBrowser获取完整COOKIE,希望对你有所帮助。 [C语言系列]怎么使用webbrowser获取页面中的button元素。并触… [C语言系列]C# 过滤html,js,css代码 正则表达式 [C语言系列]C# DataGridView显示行号的两种方法 [C语言系列]C# WinForm 中Label自动换行 解决方法 [C语言系列]C# 线程调用主线程中的控件 [电脑应用]c# winform 打包部署 自定义界面 或设置开机启动 [C语言系列]C# 和 Linux 时间戳转换 [C语言系列]C#实现 WebBrowser中新窗口打开链接用默认或者指定… [C语言系列]C#全角和半角转换 [C语言系列]c#WebBrowser查找并选择文本
|