`

C# Web开发 标准读写Cookies的方法 支持跨二级域和虚拟目录

阅读更多

  在博客园看到另外一个朋友的可跨二级域操作Cookies方法,在它基础上完善了一下,现发出来

 我参考的哪位朋友的文章地址是:http://www.cnblogs.com/voswin/articles/1281520.html

 

<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->    /// <summary>
    
/// 添加/更新 Cookies
    
/// </summary>
    
/// <param name="_domain"></param>
    
/// <param name="_cookiepath"></param>
    
/// <param name="_key"></param>
    
/// <param name="_cookiename"></param>
    
/// <param name="_value"></param>
    public static void SetUserCookies(string _domain, string _cookiepath, string _key, string _cookiename, string _value, DateTime _expires)
    {

        HttpCookie cookie 
= HttpContext.Current.Request.Cookies[_key];
        
        
//防止中文乱码
        _value = System.Web.HttpUtility.UrlEncode(_value);
        
//加密
        _value = DESEncrypt.Encrypt(_value);

        
if (cookie == null)
        {
            cookie 
= new HttpCookie(_key);
            cookie.Domain 
= _domain;
            cookie.Path 
= _cookiepath;
            cookie.Expires 
= _expires;

            cookie.Values.Add(_cookiename, _value);                
            HttpContext.Current.Response.AppendCookie(cookie);

        }
        
else
        {

            cookie.Domain 
= _domain;
            cookie.Path 
= _cookiepath;
            cookie.Expires 
= _expires;

            
if (cookie.Values[_cookiename] != null)
            {  
                cookie.Values.Set(_cookiename, _value);
            }
            
else
            {

                cookie.Values.Add(_cookiename, _value);
            }
            HttpContext.Current.Response.SetCookie(cookie);
            
        }

    }
    
/// <summary>
    
/// 读取Cookies
    
/// </summary>
    
/// <param name="_key"></param>
    
/// <param name="_cookiename"></param>
    
/// <returns></returns>
    public static string GetUserCookies(string _key, string _cookiename)
    {

        HttpCookie cookie 
= HttpContext.Current.Request.Cookies[_key];
        
        
if (cookie != null)
        {

            
string _value = cookie.Values.Get(_cookiename);

            
if (!string.IsNullOrEmpty(_value))
            {
                
//防止中文乱码
                _value = System.Web.HttpUtility.UrlDecode(_value);
                
//解密
                _value = DESEncrypt.Decrypt(_value);
                
return _value;
            }
            
else
            {
                
return "";
            }
        }
        
else
        {
            
return "";
        }

    }
    
/// <summary>
    
/// 清除Cookies
    
/// </summary>
    
/// <param name="_domain"></param>
    
/// <param name="_cookiepath"></param>
    
/// <param name="key"></param>
    public static void ClearUserCookies(string _domain, string _cookiepath, string _key)
    {
        HttpCookie cookie 
= HttpContext.Current.Request.Cookies[_key];
        
if (cookie != null)
        {
            cookie.Values.Clear();

            cookie.Domain 
= _domain;
            cookie.Path 
= _cookiepath;
            cookie.Expires 
= DateTime.Now.AddDays(-1);

            HttpContext.Current.Response.SetCookie(cookie);
        }

    }

 

加密Cookies和解密Cookies方法:

 

加密/解密方法 DESEncrypt
<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->    public class DESEncrypt
    {
        
#region ========加密========

        
/// <summary>
        
/// 加密
        
/// </summary>
        
/// <param name="Text"></param>
        
/// <returns></returns>
        public static string Encrypt(string Text)
        {
            
return Encrypt(Text, "lixyvip");
        }
        
/// <summary> 
        
/// 加密数据 
        
/// </summary> 
        
/// <param name="Text"></param> 
        
/// <param name="sKey"></param> 
        
/// <returns></returns> 
        public static string Encrypt(string Text, string sKey)
        {
            DESCryptoServiceProvider des 
= new DESCryptoServiceProvider();
            
byte[] inputByteArray;
            inputByteArray 
= Encoding.Default.GetBytes(Text);
            des.Key 
= ASCIIEncoding.ASCII.GetBytes(System.Web.Security.FormsAuthentication.HashPasswordForStoringInConfigFile(sKey, "md5").Substring(08));
            des.IV 
= ASCIIEncoding.ASCII.GetBytes(System.Web.Security.FormsAuthentication.HashPasswordForStoringInConfigFile(sKey, "md5").Substring(08));
            System.IO.MemoryStream ms 
= new System.IO.MemoryStream();
            CryptoStream cs 
= new CryptoStream(ms, des.CreateEncryptor(), CryptoStreamMode.Write);
            cs.Write(inputByteArray, 
0, inputByteArray.Length);
            cs.FlushFinalBlock();
            StringBuilder ret 
= new StringBuilder();
            
foreach (byte b in ms.ToArray())
            {
                ret.AppendFormat(
"{0:X2}", b);
            }
            
return ret.ToString();
        }

        
#endregion

        
#region ========解密========


        
/// <summary>
        
/// 解密
        
/// </summary>
        
/// <param name="Text"></param>
        
/// <returns></returns>
        public static string Decrypt(string Text)
        {
            
return Decrypt(Text, "lixyvip");
        }
        
/// <summary> 
        
/// 解密数据 
        
/// </summary> 
        
/// <param name="Text"></param> 
        
/// <param name="sKey"></param> 
        
/// <returns></returns> 
        public static string Decrypt(string Text, string sKey)
        {
            
try
            {
                DESCryptoServiceProvider des 
= new DESCryptoServiceProvider();
                
int len;
                len 
= Text.Length / 2;
                
byte[] inputByteArray = new byte[len];
                
int x, i;
                
for (x = 0; x < len; x++)
                {
                    i 
= Convert.ToInt32(Text.Substring(x * 22), 16);
                    inputByteArray[x] 
= (byte)i;
                }
                des.Key 
= ASCIIEncoding.ASCII.GetBytes(System.Web.Security.FormsAuthentication.HashPasswordForStoringInConfigFile(sKey, "md5").Substring(08));
                des.IV 
= ASCIIEncoding.ASCII.GetBytes(System.Web.Security.FormsAuthentication.HashPasswordForStoringInConfigFile(sKey, "md5").Substring(08));
                System.IO.MemoryStream ms 
= new System.IO.MemoryStream();
                CryptoStream cs 
= new CryptoStream(ms, des.CreateDecryptor(), CryptoStreamMode.Write);
                cs.Write(inputByteArray, 
0, inputByteArray.Length);
                cs.FlushFinalBlock();
                
return Encoding.Default.GetString(ms.ToArray());
            }
            
catch 
            {
                
return Text;
            }
        }

        
#endregion
    }

 

 

读取当前客户机器所有的Cookies代码:

 

<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->            string[] keyArr = HttpContext.Current.Request.Cookies.AllKeys;
            
for (int c = 0; c < keyArr.Length; c++)
            {
                Response.Write(HttpContext.Current.Request.Cookies[keyArr[c]].Name);
                Response.Write(
"<br />");
                Response.Write(HttpContext.Current.Request.Cookies[keyArr[c]].Expires.ToString());
                Response.Write(
"<br />");
                Response.Write(HttpContext.Current.Request.Cookies[keyArr[c]].Value);
                Response.Write(
"<br />");
                Response.Write(
"<br />");
            }

 

 

 

 使用或自己写重载方法参考示例:

SetUserCookies(SiteInfo.DomainName, "/", "hnce", name, str, DateTime.Now.AddMinutes(miniute));

return GetUserCookies("hnce", name);

ClearUserCookies(SiteInfo.DomainName, "/", "hnce");

 

另外提醒一下,cookie.Values.Add(_cookiename, _value); 跟 cookie.Values[_cookiename] = _value; 这两种方式都可以设置Cookies的值,但是Add和Set方法后,读取要使用Get方法,而Values[]赋值方式,读取要使用HttpContext.Current.Request.Cookies[_key][_cookiename].ToString() 

否则有Cookies读取不了的情况。

 

//下面附参考文章的部分内容说明

//------------------------------------------------------------------------
Cookie有三个属性需要注意一下:
1. Domain  域
2. Path       路径
3. Expires  过期时间

跨域操作需要设置域属性:
Response.Cookies("MyCookie").Domain = "cnblogs.com"; (这里指的是泛域名)
这样在其它二级域名下就都可以访问到了, ASP 和 ASP.NET 测试通过

虚拟目录下访问:
我在ASP端做了下测试,.NET的没试,  如果不指定Path属性, 不同虚拟目录下Cookie无法共享
将Response.Cookies("MyCookie").Path = "/" 就可以了

总的写法:
Response.Cookies("MyCookie").Domain = "cnblogs.com";
Response.Cookies("MyCookie").Path = "/"
Response.Cookies("MyCookie").Expires = Now + 365;
Response.Cookies("MyCookie")("Test") = "test";

 

分享到:
评论

相关推荐

    c#web开发入门经典

    asp.net作为微软下一代主推,c#专为之设计,本经典教程以c#为基础的面向对象web开发,属于基础入门级的经典教程了。

    c#简单web服务器开发实例

    c#简单web服务器开发实例,通过HttpListener来实现

    C# WebAPI示例

    C# WebAPI示例 C# WebAPI示例 C# WebAPI示例C# WebAPI示例

    C#动态创建WEB/FTP虚拟目录

    在Windows中,一般使用WMI管理动态目录,DirectoryEntry类就是对这些接口的封装,可以用来比较简单的实现托管编程创建虚拟目录!

    c#读写INI文件方法

    c#读写INI文件方法 c#读写INI文件 c#读写INI配置文件的方法 c#读写INI配置文件方法 c#读写INI文件方法 c#读写INI文件 c#读写INI配置文件的方法 c#读写INI配置文件方法

    c#调用DiscUtils读写vhd虚拟盘

    c#调用开源库DiscUtils读写vhd虚拟盘

    C# Redis数据库读写分离

    本代码为C#语言实现Redis数据库读写分离的实例。

    C# WEB API

    C# WEB API 最近项目上要用到WEB API 接口,参考网上相关文档写了个简单的调用实例。供大家参考,希望对大家有帮助。

    c#WebServer简单示例

    c#WebServer简单示例 这是我第一次学习webserver时候别人给的觉得非常好用!简单明白!

    C# WinForm 读写XML文件

    C# WinForm 读写XML文件 C# WinForm 读写XML文件

    C# 控制虚拟摄像头

    控制虚拟摄像头的资料和源码,比较全的资料,还有C#实例代码。

    C# 二进制文件的读写

    C# 二进制文件的读写C# 二进制文件的读写C# 二进制文件的读写C# 二进制文件的读写

    一种C#读写二进制文件的通用方法-转

    一种C#读写二进制文件的通用方法-转 可学习学习,不错的解决方法。

    Web Service编程:用C#_NET开发网络服务

    Web Service编程--用C#.NET开发网络服务(1C 作者:陆昆仑,李旭东,吴缓静 编著 出版社:希望电子 出版时间:2003年04月 第一章 .NET和.NET框架 第二章 C#基本语法 第三章 面向对象的C# 第四章 C#高级...

    c#操作properties,读写配置文件

    c#操作properties,读写配置文件,非常方便,几行代码就搞定

    C# MX Component控件读写PLC

    MX Component,c#,winfrom,.net,控件读写三菱PLC-FX5U,在安装好三菱的MX Component 工具 并配置好通道等参数之后,使用c# winfrom开发 PLC的通讯,包括单个值读取,批量读取,轮询等等。 以及写入等操作

    C# WinForm读写INI文件

    C# WinForm读写INI文件 C# WinForm读写INI文件 C# WinForm读写INI文件

    C#读写Excel和Word文件

    实现C#读写Excel和Word文件基本操作,可以读写Word文件和读出Excel中的数据并实现Excel与数据库的导入与导出

    C#Web应用程序入门经典_PART1

    怀旧篇 C#Web应用程序入门经典 格式:PDG 共3部分 20M 1,2 章 介绍 基础知识 环境和体系结构 .NET环境下的WEB开发 3~13 介绍功能 用户界面和服务器控件 ADO.NET 数据绑定 ASP.NET状态管理...

    C#多线程读写sqlite

    多线程读写sqlite数据库,同步锁,计时测试读写性能,

Global site tag (gtag.js) - Google Analytics