zoukankan      html  css  js  c++  java
  • ASPNETCOOKIE

    Cookie 是一小段文本信息,伴随着用户请求和页面在 Web 服务器和浏览器之间传递。Cookie 包含每次用户访问站点时 Web 应用程序都可以读取的信息。
    Cookie 明文保存在客户端,每次随请求被发送到服务器端(存放在Header中)
    浏览器对Cookie的大小和数量有限制,大部分浏览器支持最大为4M最多为20个的cookie,当cookie数量超过时,旧的cookie会被清除
    
    在Asp.net中,读写Cookie是通过使用HttpCookie类来完成的,它的定义如下:
    
    public sealed class HttpCookie
    {
        // 获取或设置将此 Cookie 与其关联的域。默认值为当前域。
        public string Domain { get; set; }
        // 获取或设置此 Cookie 的过期日期和时间(在客户端)。
        public DateTime Expires { get; set; }
        // 获取一个值,通过该值指示 Cookie 是否具有子键。
        public bool HasKeys { get; }
        // 获取或设置一个值,该值指定 Cookie 是否可通过客户端脚本访问。
        // 如果 Cookie 具有 HttpOnly 属性且不能通过客户端脚本访问,则为 true;否则为 false。默认为 false。
        public bool HttpOnly { get; set; }
        // 获取或设置 Cookie 的名称。
        public string Name { get; set; }
        // 获取或设置要与当前 Cookie 一起传输的虚拟路径。默认值为当前请求的路径。
        public string Path { get; set; }
        // 获取或设置一个值,该值指示是否使用安全套接字层 (SSL)(即仅通过 HTTPS)传输 Cookie。
        public bool Secure { get; set; }
        // 获取或设置单个 Cookie 值。默认值为空引用。
        public string Value { get; set; }
        // 获取单个 Cookie 对象所包含的键值对的集合。
        public NameValueCollection Values { get; }
        // 获取 System.Web.HttpCookie.Values 属性的快捷方式。
        public string this[string key] { get; set; }
    }
    
    写入Cookie,在服务端写的Cookie,最后其实是通过HTTP的响应头这种途径发送到客户端的。每一个写入动作,都会产生一个【Set-Cookie】的响应头。
    HttpCookie cookie = new HttpCookie("MyCookieName", "string value");
    Response.Cookies.Add(cookie);
    
    读取cookie,Cookie是放在请求头中,发送到服务端的。如果你一直刷新页面,就能发现, 每次HTTP请求,Cookie都会被发送
    HttpCookie cookie = Request.Cookies["MyCookieName"];
    if( cookie != null )
        labCookie1.Text = cookie.Value;
    else
        labCookie1.Text = "未定义";
    
    删除Cookie,设置此Cookie已经过期,浏览器接收到这个Cookie时,便会删除它们。 
    HttpCookie cookie = new HttpCookie("MyCookieName", null);
    cookie.Expires = new DateTime(1900, 1, 1);
    Response.Cookies.Add(cookie);
    
    对于复杂对象的cookie,一种方式将每个属性依次放入cookie中,第二种方式将复杂对象转换成josn对象再存入cookie中
    
    
    使用js读写cookie
    
    <script type="text/javascript">
        function WriteCookie() {
            var cookie = "cookie_js=22222222; path=/";
            document.cookie = cookie;
        }    
    </script>
    <script type="text/javascript">
        function ReadCookie() {
            alert(document.cookie);
        }    
    </script>
    
    
    除非使用无Cookie的会话模式,否则Session是需要Cookie的支持,服务端需要将会话标识ID保存到Cookie中。
    
    
    Cookie扩展
    /// <summary>
    /// 用于方便使用Cookie的扩展工具类
    /// </summary>
    public static class CookieExtension
    {
        // 我们可以为一些使用频率高的类型写专门的【读取】方法
    
        /// <summary>
        /// 从一个Cookie中读取字符串值。
        /// </summary>
        /// <param name="cookie"></param>
        /// <returns></returns>
        public static string GetString(this HttpCookie cookie)
        {
            if( cookie == null )
                return null;
    
            return cookie.Value;
        }
    
        /// <summary>
        /// 从一个Cookie中读取 Int 值。
        /// </summary>
        /// <param name="cookie"></param>
        /// <param name="defaultVal"></param>
        /// <returns></returns>
        public static int ToInt(this HttpCookie cookie, int defaultVal)
        {
            if( cookie == null )
                return defaultVal;
    
            return cookie.Value.TryToInt(defaultVal);
        }
    
        /// <summary>
        /// 从一个Cookie中读取值并转成指定的类型
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="cookie"></param>
        /// <returns></returns>
        public static T ConverTo<T>(this HttpCookie cookie)
        {
            if( cookie == null )
                return default(T);
    
            return (T)Convert.ChangeType(cookie.Value, typeof(T));
        }
    
        /// <summary>
        /// 从一个Cookie中读取【JSON字符串】值并反序列化成一个对象,用于读取复杂对象
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="cookie"></param>
        /// <returns></returns>
        public static T FromJson<T>(this HttpCookie cookie)
        {
            if( cookie == null )
                return default(T);
    
            return cookie.Value.FromJson<T>();
        }
    
    
        /// <summary>
        /// 将一个对象写入到Cookie
        /// </summary>
        /// <param name="obj"></param>
        /// <param name="name"></param>
        /// <param name="expries"></param>
        public static void WriteCookie(this object obj, string name, DateTime? expries)
        {
            if( obj == null )
                throw new ArgumentNullException("obj");
    
            if( string.IsNullOrEmpty(name) )
                throw new ArgumentNullException("name");
            
    
            HttpCookie cookie = new HttpCookie(name, obj.ToString());
    
            if( expries.HasValue )
                cookie.Expires = expries.Value;
    
            HttpContext.Current.Response.Cookies.Add(cookie);
        }
    
        /// <summary>
        /// 删除指定的Cookie
        /// </summary>
        /// <param name="name"></param>
        public static void DeleteCookie(string name)
        {
            if( string.IsNullOrEmpty(name) )
                throw new ArgumentNullException("name");
    
            HttpCookie cookie = new HttpCookie(name);
    
            // 删除Cookie,其实就是设置一个【过期的日期】
            cookie.Expires = new DateTime(1900, 1, 1);
            HttpContext.Current.Response.Cookies.Add(cookie);
        }
    }
    
    在使用System.Web.Security.FormsAuthentication.SetAuthCookie("fish", false)来标示验证时,服务器端将FormsAuthenticationTicket加密后使用Cookie存放
    
    以上信息来自http://www.cnblogs.com/fish-li/archive/2011/07/03/2096903.html
  • 相关阅读:
    分享我收藏的SQL知识以及SQL语句简单实践通俗易懂
    分享一个分层架构音乐网站源码(第二版本)一步一步构造(三):项目计划和安排
    【程序分享】分享一个分层架构音乐网站源码(使用了ASP.NET+sql server 2005 )
    分享一个分层架构音乐网站源码(第二版本)一步一步构造(二):用户需求的分析与处理
    PHP简洁函数
    常见的算法快速分析解决(二)
    【程序分享】分享一个大学期间为企业做的个人CMS(使用ASP.NET+Access)
    关于大型页游后端管理系统的一点经验和个人见解
    Web开发之JavaScript(不断添加)
    分享一个分层架构音乐网站源码(第二版本)一步一步构造(一):综述
  • 原文地址:https://www.cnblogs.com/TeyGao/p/2736271.html
Copyright © 2011-2022 走看看