一、接口文件

复制代码 代码如下:

using System;

using System.ComponentModel;

using System.net;

using System.Runtime.InteropServices;

using System.Security;

using System.Security.Permissions;

using System.Text;

namespace cookieHandler

{

    internal sealed class INativeMethods

    {

        #region enums

        public enum ErrorFlags

        {

            ERROR_INSUFFICIENT_BUFFER = 122,

            ERROR_INVALID_PARAMETER = 87,

            ERROR_NO_MORE_ITEMS = 259

        }

        public enum InternetFlags

        {

            INTERNET_COOKIE_httponly = 8192, //Requires IE 8 or higher     

            INTERNET_COOKIE_THIRD_PARTY = 131072,

            INTERNET_FLAG_RESTRICTED_ZONE = 16

        }

        #endregion

        #region DLL Imports

        [SuppressUnmanagedCodeSecurity, SecurityCritical, DllImport(“wininet.dll”, EntryPoint = “InternetGetCookieExW”, CharSet = CharSet.Unicode, SetLastError = true, ExactSpelling = true)]

        internal static extern bool InternetGetCookieEx([In] string Url, [In] string cookieName, [Out] StringBuilder cookieData, [In, Out] ref uint pchCookieData, uint flags, IntPtr reserved);

        #endregion

    }

}

二、获取cookie类

复制代码 代码如下:

using System;

using System.Collections.Generic;

using System.ComponentModel;

using System.Net;

using System.Runtime.InteropServices;

using System.Security;

using System.Security.Permissions;

using System.Text;

namespace CookieHandler

{

    /// <SUMMARY></SUMMARY>

    /// 取得WebBrowser的完整Cookie。

    /// 因为默认的webBrowser1.Document.Cookie取不到HttpOnly的Cookie

    /// IE7不兼容,IE8可以,其它未知

    ///

    public class FullWebBrowserCookie

    {

        public static Dictionary<string, string> GetCookieList(Uri uri, bool throwIfNoCookie)

        {

            Dictionary<string, string> dict = new Dictionary<string, string>();

            string cookie = GetCookieInternal(uri, throwIfNoCookie);

            Console.WriteLine(“FullWebBrowserCookie – 所有cookie:” + cookie);

            string[] arrCookie = cookie.Split(‘;’);

            foreach (var item in arrCookie)

            {

                string[] arr = item.Split(‘=’);

                string key = arr[0].Trim();

                string val = “”;

                if (arr.Length >= 2)

                {

                    val = arr[1].Trim();

                }

                if (!dict.ContainsKey(key))

                {

                    dict.Add(key, val);

                }

            }

            Console.WriteLine(“FullWebBrowserCookie – cookie已载入dict,共” + dict.Count.ToString() + “项”);

            return dict;

        }

        public static string GetCookieValue(string key, Uri uri, bool throwIfNoCookie)

        {

            Console.WriteLine(“GetCookieValue”);

            Dictionary<string, string> dict = GetCookieList(uri, throwIfNoCookie);

            if (dict.ContainsKey(key))

            {

                return dict[key];

            }

            return “”;

        }

        [SecurityCritical]

        public static string GetCookieInternal(Uri uri, bool throwIfNoCookie)

        {

            Console.WriteLine(“GetCookieInternal”);

            uint pchCookieData = 0;

            string url = UriToString(uri);

            uint flag = (uint)INativeMethods.InternetFlags.INTERNET_COOKIE_HTTPONLY;

            //Gets the size of the string builder     

            if (INativeMethods.InternetGetCookieEx(url, null, null, ref pchCookieData, flag, IntPtr.Zero))

            {

                pchCookieData++;

                StringBuilder cookieData = new StringBuilder((int)pchCookieData);

                //Read the cookie     

                if (INativeMethods.InternetGetCookieEx(url, null, cookieData, ref pchCookieData, flag, IntPtr.Zero))

                {

                    DemandWebPermission(uri);

                    return cookieData.ToString();

                }

            }

            int lastErrorCode = Marshal.GetLastWin32Error();

            if (throwIfNoCookie || (lastErrorCode != (int)INativeMethods.ErrorFlags.ERROR_NO_MORE_ITEMS))

            {

                throw new Win32Exception(lastErrorCode);

            }

            return null;

        }

        private static void DemandWebPermission(Uri uri)

        {

            string uriString = UriToString(uri);

            if (uri.IsFile)

            {

                string localPath = uri.LocalPath;

                new FileIOPermission(FileIOPermissionAccess.Read, localPath).Demand();

            }

            else

            {

                new WebPermission(NetworkAccess.Connect, uriString).Demand();

            }

        }

        private static string UriToString(Uri uri)

        {

            if (uri == null)

            {

                throw new ArgumentNullException(“uri”);

            }

            UriComponents components = (uri.IsAbsoluteUri ? UriComponents.AbsoluteUri : UriComponents.SerializationInfoString);

            return new StringBuilder(uri.GetComponents(components, UriFormat.SafeUnescaped), 2083).ToString();

        }

    }

}

您可能感兴趣的文章:

  • JavaScript获取浏览器信息的方法
  • Js 获取、判断浏览器版本信息的简单方法
  • 获取IE浏览器Cookie信息的方法
声明:本站(华域联盟www.cnhackhy.com)所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。