如何获取浏览器存储 Cookie

微创社(MCC) 2009-08-13 10:33:29
提问的背景:
由于不同的浏览器存储 Cookie 的方式不同,
因此,同一计算机上的不同浏览器没有必要能够读取彼此的 Cookie。
例如,如果使用 Internet Explorer 测试一个页面,
然后再使用其他浏览器进行测试,
那么后者将不会找到 Internet Explorer 保存的 Cookie。

[1]问题一:
当通过HttpWebRequest/httpWebResponse编写代码时,
这些Cookie都存到哪里去了?(跟浏览器进行对比)
注:如果认为是程序自己维护的,也请说明一下~~

[2]问题二:
如何读取IE中的Cookie

[3]问题三:
如何读取其它浏览器中的Cookie
...全文
1756 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
stoneson 2011-04-08
  • 打赏
  • 举报
回复
[System.Runtime.InteropServices.DllImport("wininet.dll", SetLastError = true)]
public static extern bool InternetGetCookie(string url, string cookieName,StringBuilder cookieData, ref int size);

private static int INTERNET_COOKIE_HTTPONLY = 0x00002000;
[System.Runtime.InteropServices.DllImport("wininet.dll", SetLastError = true)]
private static extern bool InternetGetCookieEx(string pchURL, string pchCookieName,
StringBuilder pchCookieData, ref System.UInt32 pcchCookieData,
int dwFlags, IntPtr lpReserved);

public static CookieContainer GetUriCookieContainer(Uri uri)
{
CookieContainer cookies = null;
//定义Cookie数据的大小。
int datasize = 256;
StringBuilder cookieData = new StringBuilder(datasize);

if (!InternetGetCookie(uri.ToString(), null, cookieData, ref datasize))
{
if (datasize < 0) return null;
// 确信有足够大的空间来容纳Cookie数据。
cookieData = new StringBuilder(datasize);
if (!InternetGetCookie(uri.ToString(), null, cookieData, ref datasize)) return null;
}
try
{
string SessionId = GetSessionId( uri.ToString());
if (SessionId.Trim().Length > 0)
{
cookieData.Append(";"+SessionId);
}
}
catch{}
if (cookieData.Length > 0)
{
cookies = new CookieContainer();
cookies.SetCookies(uri, cookieData.ToString().Replace(';', ','));
}
return cookies;
}

public static string GetSessionId(string url)
{
return GetCookie( url,"ASP.NET_SessionId");
}
public static string GetCookie(string url,string cookieName)
{
System.UInt32 size = 256;
StringBuilder cookie = new StringBuilder(256);

InternetGetCookieEx(url, cookieName, cookie, ref size,
INTERNET_COOKIE_HTTPONLY, IntPtr.Zero);

return cookie.ToString();
}
stoneson 2011-04-08
  • 打赏
  • 举报
回复
public static extern bool InternetGetCookie(string url, string cookieName,StringBuilder cookieData, ref int size);

private static int INTERNET_COOKIE_HTTPONLY = 0x00002000;
[System.Runtime.InteropServices.DllImport("wininet.dll", SetLastError = true)]
private static extern bool InternetGetCookieEx(string pchURL, string pchCookieName,
StringBuilder pchCookieData, ref System.UInt32 pcchCookieData,
int dwFlags, IntPtr lpReserved);

public static CookieContainer GetUriCookieContainer(Uri uri)
{
CookieContainer cookies = null;
//定义Cookie数据的大小。
int datasize = 256;
StringBuilder cookieData = new StringBuilder(datasize);

if (!InternetGetCookie(uri.ToString(), null, cookieData, ref datasize))
{
if (datasize < 0) return null;
// 确信有足够大的空间来容纳Cookie数据。
cookieData = new StringBuilder(datasize);
if (!InternetGetCookie(uri.ToString(), null, cookieData, ref datasize)) return null;
}
try
{
string SessionId = GetSessionId( uri.ToString());
if (SessionId.Trim().Length > 0)
{
cookieData.Append(";"+SessionId);
}
}
catch{}
if (cookieData.Length > 0)
{
cookies = new CookieContainer();
cookies.SetCookies(uri, cookieData.ToString().Replace(';', ','));
}
return cookies;
}

public static string GetSessionId(string url)
{
return GetCookie( url,"ASP.NET_SessionId");
}
public static string GetCookie(string url,string cookieName)
{
System.UInt32 size = 256;
StringBuilder cookie = new StringBuilder(256);

InternetGetCookieEx(url, cookieName, cookie, ref size,
INTERNET_COOKIE_HTTPONLY, IntPtr.Zero);

return cookie.ToString();
}
mylocoy 2010-03-24
  • 打赏
  • 举报
回复
InternetGetCookie 不能获取HttpOnly方式的COOKIE,比如ASP.NET_SessionId
InternetGetCookieEx要安装了IE8.0才支持。我也没有好的解决方案
微创社(MCC) 2009-09-21
  • 打赏
  • 举报
回复
过节了,发钱了。

^_^
微创社(MCC) 2009-09-02
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 robin521 的回复:]
楼主啊,不好意思,刚才翻了半天书也没有找到你要的东西.我明明记得我的书上有来着,专门针对不对版本IE写的,其实也不难,你只要try catch就行了,但是具体代码就要你自己想想了,我那本书上代码挺经典的.
[/Quote]

多谢,过一段时间再来关注这个。
goalwdg 2009-08-20
  • 打赏
  • 举报
回复
学习
robin521 2009-08-20
  • 打赏
  • 举报
回复
楼主啊,不好意思,刚才翻了半天书也没有找到你要的东西.我明明记得我的书上有来着,专门针对不对版本IE写的,其实也不难,你只要try catch就行了,但是具体代码就要你自己想想了,我那本书上代码挺经典的.
微创社(MCC) 2009-08-20
  • 打赏
  • 举报
回复
问题二:自顶一下

using System;
using System.Runtime.InteropServices;
using System.Text;
using System.Net;
using System.Linq;
using System.Collections.Generic;

namespace PCTools
{
/**/
///<summary>
/// 获取Cookie的方法类。
///</summary>
public class CookieManger
{
[DllImport("wininet.dll", SetLastError = true)]
public static extern bool InternetGetCookie(string url, string cookieName,StringBuilder cookieData, ref int size);

public static CookieContainer GetUriCookieContainer(Uri uri)
{
CookieContainer cookies = null;
//定义Cookie数据的大小。
int datasize = 256;
StringBuilder cookieData = new StringBuilder(datasize);

if (!InternetGetCookie(uri.ToString(), null, cookieData, ref datasize))
{
if (datasize < 0) return null;
// 确信有足够大的空间来容纳Cookie数据。
cookieData = new StringBuilder(datasize);
if (!InternetGetCookie(uri.ToString(), null, cookieData, ref datasize)) return null;
}

if (cookieData.Length > 0)
{
cookies = new CookieContainer();
cookies.SetCookies(uri, cookieData.ToString().Replace(';', ','));
}
return cookies;
}

public static void PrintCookies(CookieContainer cookies, Uri uri)
{
CookieCollection cc = cookies.GetCookies(uri);

foreach (var cook in cc)
{
Console.WriteLine(cook);
}
}
}

public class Test
{
static void Main(string[] args)
{
string url = @"http://www.kaixin001.com/";
Uri uri = new Uri(url);
CookieContainer cookies = CookieManger.GetUriCookieContainer(uri);
CookieManger.PrintCookies(cookies,uri);

Console.ReadKey();
}
}
}
wuyq11 2009-08-13
  • 打赏
  • 举报
回复
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(args[0]);

HttpWebResponse response = (HttpWebResponse) request.GetResponse();
response.Cookies = request.CookieContainer.GetCookies(request.RequestUri);

Request.Cookies[""].Value;
Cookie是把与用户和网站相关的信息存储比会话时间还长的一种方式。
Cookie存储在用户的硬盘上(一般存储在Web浏览器软件所在的文件夹上,称为Cookies)

mythad 2009-08-13
  • 打赏
  • 举报
回复
学习!
wdzr_826 2009-08-13
  • 打赏
  • 举报
回复
1.C:\Documents and Settings\Daniel_he\Cookies
2.Cookie如果跨域访问是不能读取的,你自己的Web程序读取不了其他网站的Cookie,这是网站安全方面的问题,不然大大的乱套了。
3.更是不行。
chaozi_249 2009-08-13
  • 打赏
  • 举报
回复
mark
yinglu206 2009-08-13
  • 打赏
  • 举报
回复
帮顶了,关注!

110,545

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧