在Asp.net中使用Cookie,首先要注意4个问题。
1.Cookie最大存储量:<= 4k。这个值是由客户端浏览器决定的。
2.缓存问题。Cookie在客户端有一个缓存时间,比如缓存1天。那么Cookie在本地设置后,在1天之内,打开这个网页,客户端浏览器会自动加载这个Cookie。另外,每次调试程序,也需要手动清空浏览器Cookie缓存,以防止历史Cookie干扰调试。Windows下清空Cookie脚本: 。如果超过缓存日期,
3.一维Cookie在Asp.net中的操作例子,以及创建、访问与更改时的方向问题。
3.1 Cookie,第一次创建,是在服务端向客户端发起Response(回应)之前。因此,Cookie应该在Response中创建并设置值:
1 HttpCookie newCookie = Response.Cookies["CookieSet_Single_1"];2 newCookie.Value = "CookieSet_Single_1_Value1";3 newCookie.HttpOnly = true;4 newCookie.Expires = DateTime.Now.AddDays(1);
如果此时服务端还未向客户端进行回应,而需要访问Cookie,应该在Response中访问:
1 string str = Response.Cookies["CookieSet_Single_1"].Value;
3.2 当服务端向客户端回应后,Cookie就被正式设置到客户端里了。接着,客户端访问服务端,这是Request(请求),因此,服务端要访问Cookie,应该是访问客户端发来的Request中的Cookie,因此,此时访问Cookie,应该是在Request中访问:
1 string str = Request.Cookies["CookieSet_Single_1"].Value;
很多人发现ASP.net的Cookie在不同页面中传递时会丢失,就是因为没有弄清这个方向问题,他们第一次在Response中设置Cookie,当客户端再次访问服务端,他们在Response读Cookie,当然读不到。因为此时Cookie在Request里。
3.3 当Cookie已经在客户端中被设置后,此时,服务端如果需要更改Cookie,那么问题就来了。
3.3.1 首先我们要明白一个规则,当服务端要创建,或者更新Cookie时,需要把创建或修改的Cookie,设置在Respon里。这样,这个创建或更新操作,才会发给客户端。由于创建操作在之前已经说了,这里我们只谈更新。
3.3.2 明白了这个规则后,更新一个Cookie要分两步。第一步是把需要更新的Cookie,由Request里,复制到Response里:
1 Response.Cookies.Add( Request.Cookies["CookieSet_Single_1"] );
接着,再在Response里,对它进行修改:
1 Response.Cookies["CookieSet_Single_1"].Value = "NewValue";
这时,当浏览器接收到服务端的响应后,则会对Cookie进行更改。
3.4 删除操作。
3.4.1 根据更改操作的规则,要删除一个操作,首先仍然得把它从Request中,复制到Response中:
1 Response.Cookies.Add(Request.Cookies["CookieSet_Single_1"]);
3.4.1 根据更改操作,我们可以把一个值设置为空字符串,以达到“假删除”的目的。但不推荐:
1 Response.Cookies["CookieSet_Single_1"].Value = "";
3.4.2 科学的删除操作,是把Cookie的失效时间,设置为过期的时间,比如昨天:
1 Response.Cookies["CookieSet_Single_1"].Expires = DateTime.Now.AddDays(-1);
3.5 判断存在性:判断一个值是否存在(如果有删除操作,请保证删除操作不是假删除):
1 if ( Request.Cookies["CookieSet_Single_1"] != null)2 {3 Cookie存在4 }5 else6 {7 Cookie不存在8 }
4.二维Cookie的操作,基本规则以及操作方向,同于一维操作,因此下面代码不详述方向。
4.1 增加
1 HttpCookie newCookie = Response.Cookies["CookieSet_Single_1"];2 newCookie.Values.Add("Key1", "Value1");3 newCookie.Values.Add("Key2", "Value2");4 newCookie.HttpOnly = true;5 newCookie.Expires = DateTime.Now.AddDays(1);
4.2 访问
1 string str = Request.Cookies["CookieSet_Single_1"]["Key1"];
4.3 修改
1 Response.Cookies.Add(Request.Cookies["CookieSet_Single_1"]);2 Response.Cookies["CookieSet_Single_1"]["Key1"] = "NewValue";
4.4 整体删除,即删除这个维度。注意,二维Cookie无法在维度内删除某个分支。如果需要删除某个分支,只能使用设置为"null"的假删除。
1 Response.Cookies.Add(Request.Cookies["CookieSet_Single_1"]);2 Response.Cookies["CookieSet_Single_1"].Expires = DateTime.Now.AddDays(-1);
4.5 判断存在性
4.5.1 整个维度是否存在
1 if (Request.Cookies["CookieSet_Single_1"] != null)2 {3 Cookie存在4 }5 else6 {7 Cookie不存在8 }
4.5.2 一个维度中,是否存在某个KeyName的判断:
1 if (Request.Cookies["CookieSet_Single_1"]["Key1"] == null)2 {3 Key1分支不存在4 }5 else6 {7 Key1分支存在,值为 Request.Cookies["CookieSet_Single_1"]["Key1"];8 }