浅谈一些对ASP.NET Cookie的认识

开发 后端
本文将谈谈一些对ASP.NET Cookie的认识,希望本文能对大家了解ASP.NET有所帮助。

在这里我们将介绍的是一些对ASP.NET Cookie的认识,ASP.NET Cookie在Web开发中应用较多。做用户登录,我一直用form验证的方式。有时候,为了节省时间,用户希望用户名输入框能够记住用户名,省得下次重新输入。这个时候光用form验证是不行的,因为form验证的话,用户一退出系统就失效了,所以需要借助于Cookie。

本以为做这个会很轻松,谁知花了不少时间也没有成功。虽然检验用户名和密码都是正确的,但系统总是拒绝登录,然后返回到登录页面。登录页面的用户名输入框记是记住用户名了,但用户名是乱码的。

真是郁闷至极!一度以为系统发生了错乱,重启机器也还是无济于事。经反复检查和测试发现,如果在form验证之前写入cookies,就会拒绝登录。这可能是asp.net出于安全考虑,发现了一个与from标识相同的cookies值,但是它没有明确地这样提示。

解决这个问题的做法是,要先验证登录再把用户名写入cookies,这样就可以成功。

System.Web.Security.FormsAuthentication.SetAuthCookie(UserName.Text,false);//登录...  
//将用户名写入cookies  
Response.Cookies["RememberMe"].Value = HttpUtility.UrlEncode(UserName.Text, System.Text.Encoding.GetEncoding("gb2312"));  
Response.Cookies["RememberMe"].Expires = DateTime.Now.AddMonths(1); 
  • 1.
  • 2.
  • 3.
  • 4.

至于输入框的用户名显示为乱码是因为存储的是中文用户名,把中文字符写入cookies时,如果不做任何处理是会生产乱码的。解决方法是如上面红色代码所示,在写入的时候使用url编码,而且编码格式需要是中文格式的。在取得cookies值的时候做相应的解码即可:

UserName.Text = HttpUtility.UrlDecode(Request.Cookies["RememberMe"].Value, System.Text.Encoding.GetEncoding("gb2312")); 
  • 1.

另一个问题是删除cookies,以前一直以为用Response.Cookies.Remove("RememberMe")可以删除,但就是没有效果。原来调用Cookies集合的 Remove 方法可从服务器端的集合中移除 Cookie,使 Cookie 不会被发送至客户端。但是,如果客户端已存在   Cookie,则该方法无法从客户端将其移除。 解决方法是,将 Cookie 的到期日期设置为过去的日期,让用户的浏览器来删除 Cookie:

if (Response.Cookies["RememberMe"] != null) Response.Cookies["RememberMe"].Expires = DateTime.Now.AddDays(-1);//删除 
  • 1.

***一个问题是创建浏览器进程的cookies(即关闭浏览器就会自动清空),创建方法相当简单,不要设置Expires属性就是默认的浏览器进程cookies。

结尾附上关键部分的代码

System.Web.Security.FormsAuthentication.SetAuthCookie(UserName.Text,false);//登录,一定要先验证  
 
      if (RememberMe.Checked)//再写入cookie  
      {  
          if (Request.Cookies["RememberMe"] == null)  
          {  
              Response.Cookies["RememberMe"].Value = HttpUtility.UrlEncode(UserName.Text, System.Text.Encoding.GetEncoding("gb2312"));  
              Response.Cookies["RememberMe"].Expires = DateTime.Now.AddMonths(1);  
          }  
      }  
      else 
      {  
          if (Response.Cookies["RememberMe"] != null) Response.Cookies["RememberMe"].Expires = DateTime.Now.AddDays(-1);//删除  
      } 
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.

读取cookies值的时候:
 

if (!IsPostBack)  
{  
    if (Request.Cookies["RememberMe"] != null)  
    {  
        UserName.Text = HttpUtility.UrlDecode(Request.Cookies["RememberMe"].Value, System.Text.Encoding.GetEncoding("gb2312"));  
        RememberMe.Checked = true;  
    }  

  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
总结一下:

1.写一个与form验证相同用户名的值到cookies中,应该先验证后写cookies,否则会产生冲突,导致验证不能通过。

2.删除cookie的正确方法是设置已有cookies的日期为早于当前时间的日期,使用Cookies.Remove是没有效果的。

3.创建浏览器进程的cookies,不要设置Expires属性就行了,这样关闭浏览器就会自动被清空

4.cookies值是中文的时候***用gb2312编码一下,这样可以避免产生乱码。

原文标题:对ASP.NET Cookie的一些新的认识

链接:http://www.cnblogs.com/qingyun163/archive/2009/12/11/1621734.html

责任编辑:彭凡 来源: 博客园
相关推荐

2012-07-03 13:55:00

ASP.NET

2009-09-04 13:11:25

ASP.NET生成XM

2009-08-04 16:06:19

ASP.NET代码分离

2009-08-21 18:05:23

ASP.NET Ses

2013-05-31 02:18:47

ASP.NET.Net

2009-07-24 10:52:42

ASP.NET ISA

2009-07-22 16:11:43

ASP.NET AJA

2009-07-20 15:30:11

ASP.NET应用

2009-08-14 17:49:02

ASP.NET MVC

2009-07-31 18:00:35

ASP.NET工作流学

2009-07-21 11:11:44

删除CookieASP.NET

2009-07-28 18:00:11

ASP.NET程序

2009-07-27 13:01:28

TreeViewASP.NET

2009-09-23 17:29:54

三层框架

2011-07-15 09:26:04

.NET第三方控件

2009-08-03 18:16:46

ASP.NET Web

2009-08-03 09:17:30

ASP.NET Ses

2009-08-05 15:29:33

ASP.NET For

2009-07-23 15:44:39

ASP.NET MVC

2009-07-28 17:49:30

ASP.NET定期回收
点赞
收藏

51CTO技术栈公众号