ASP.NET Cookie

简介: ASP.NET 操作Cookie详解 增加,修改,删除 http://www.cnblogs.com/cpcpc/archive/2011/03/28/2123030.html Cookie,有时也用其复数形式Cookies,指某些网站为了辨别用户身份而储存在用户本地终端上的数据(通常经过加密)。

ASP.NET 操作Cookie详解 增加,修改,删除

http://www.cnblogs.com/cpcpc/archive/2011/03/28/2123030.html

Cookie,有时也用其复数形式Cookies,指某些网站为了辨别用户身份而储存在用户本地终端上的数据(通常经过加密)。定义于RFC2109。它是网景公司的前雇员Lou Montulli在1993年3月的发明。

   服务器可以利用Cookies包含信息的任意性来筛选并经常性维护这些信息,以判断在HTTP传输中的状态。Cookies最典型的应用是判定注册用户 是否已经登录网站,用户可能会得到提示,是否在下一次进入此网站时保留用户信息以便简化登录手续,这些都是Cookies的功用。另一个重要应用场合是 “购物车”之类处理。用户可能会在一段时间内在同一家网站的不同页面中选择不同的商品,这些信息都会写入Cookies,以便在最后付款时提取信息。

  Cookie可以保持登录信息到用户下次与服务器的会话,换句话说,下次访问同一网站时,用户会发现不必输入用户名和密码就已经登录了(当然,不排除用户手工删除Cookie)。而还有一些Cookie在用户退出会话的时候就被删除了,这样可以有效保护个人隐私。

程序代码
//写入
  protected void Button1_Click(object sender, EventArgs e)
  {
    HttpCookie cookie=new HttpCookie("MyCook");//初使化并设置Cookie的名称
    DateTime dt=DateTime.Now;
    TimeSpan ts = new TimeSpan(0, 0, 1,0,0);//过期时间为1分钟
    cookie.Expires = dt.Add(ts);//设置过期时间
    cookie.Values.Add("userid", "userid_value");
    cookie.Values.Add("userid2","userid2_value2");
    Response.AppendCookie(cookie);
    //输出该Cookie的所有内容
    //Response.Write(cookie.Value);//输出为:userid=userid_value&userid2=userid2_value2
  }

  //读取
  protected void Button2_Click(object sender, EventArgs e)
  {
    // HttpCookie cokie = new HttpCookie("MyCook");//初使化
    if (Request.Cookies["MyCook"]!=null)
    {
      //Response.Write("Cookie中键值为userid的值:" + Request.Cookies["MyCook"]["userid"]);//整行
      //Response.Write("Cookie中键值为userid2的值" + Request.Cookies["MyCook"]["userid2"]);
      Response.Write(Request.Cookies["MyCook"].Value);//输出全部的值
    }
  }

  //修改Cookie
  protected void Button3_Click(object sender, EventArgs e)
  {
    //获取客户端的Cookie对象
    HttpCookie cok = Request.Cookies["MyCook"];
        
    if (cok != null)
    {
      //修改Cookie的两种方法
      cok.Values["userid"] = "alter-value";
      cok.Values.Set("userid", "alter-value");

      //往Cookie里加入新的内容
      cok.Values.Set("newid", "newValue");
      Response.AppendCookie(cok);
    }      
  }

  //删除Cookie
  protected void Button4_Click(object sender, EventArgs e)
  {

    HttpCookie cok = Request.Cookies["MyCook"];
    if (cok != null)
    {
      if (!CheckBox1.Checked)
      {
        cok.Values.Remove("userid");//移除键值为userid的值
      }
      else
      {
        TimeSpan ts = new TimeSpan(-1, 0, 0, 0);
        cok.Expires = DateTime.Now.Add(ts);//删除整个Cookie,只要把过期时间设置为现在
      }
      Response.AppendCookie(cok);
    }
  }

 

原文

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

对ASP.NET Cookie的一些新的认识

做用户登录,我一直用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 );

 

 
至于输入框的用户名显示为乱码是因为存储的是中文用户名,把中文字符写入cookies时,如果不做任何处理是会生产乱码的。解决方法是如上面红色代码所示,在写入的时候使用url编码,而且编码格式需要是中文格式的。在取得cookies值的时候做相应的解码即可:
UserName.Text  =  HttpUtility.UrlDecode(Request.Cookies[ " RememberMe " ].Value, System.Text.Encoding.GetEncoding( " gb2312 " ));

 

 
另一个问题是删除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 ); // 删除

 

 
最后一个问题是创建浏览器进程的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 ); // 删除
        }
复制代码

 

读取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.写一个与form验证相同用户名的值到cookies中,应该先验证后写cookies,否则会产生冲突,导致验证不能通过。

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

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

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

相关文章
|
2月前
|
存储 开发框架 NoSQL
ASP.NET WEB——项目中Cookie与Session的用法
ASP.NET WEB——项目中Cookie与Session的用法
29 0
.net写入Cookie访问计数器
.net写入Cookie访问计数器
30 0
|
Web App开发 开发框架 安全
[ASP.NET Core 3.1]浏览器嗅探解决部分浏览器丢失Cookie问
看了前文的同学们应该都知道,搜狗、360等浏览器在单点登录中反复重定向,最终失败报错。 原因在于,非Chrome80+浏览器不识别Cookie上的SameSite=none属性值,导致认证Cookie在后续请求中被抛弃。
[ASP.NET Core 3.1]浏览器嗅探解决部分浏览器丢失Cookie问
|
XML 开发框架 负载均衡
抽丝剥茧:浅议ASP.NET Cookie的生成原理
  前言   可能有人知道 Cookie的生成由 machineKey有关, machineKey用于决定 Cookie生成的算法和密钥,并如果使用多台服务器做负载均衡时,必须指定一致的 machineKey用于解密,那么这个过程到底是怎样的呢?   如果需要在 .NETCore中使用 ASP.NETCookie,本文将提到的内容也将是一些必经之路。   抽丝剥茧,一步一步分析   首先用户通过 AccountController->Login进行登录:   //   // POST: /Account/Login   public async Task Login(LoginV
194 0
|
3月前
|
开发框架 前端开发 .NET
ASP.NET CORE 3.1 MVC“指定的网络名不再可用\企图在不存在的网络连接上进行操作”的问题解决过程
ASP.NET CORE 3.1 MVC“指定的网络名不再可用\企图在不存在的网络连接上进行操作”的问题解决过程
38 0
|
1月前
|
开发框架 前端开发 .NET
进入ASP .net mvc的世界
进入ASP .net mvc的世界
28 0
|
1月前
mvc.net分页查询案例——mvc-paper.css
mvc.net分页查询案例——mvc-paper.css
5 0
|
1月前
|
开发框架 前端开发 .NET
C# .NET面试系列六:ASP.NET MVC
<h2>ASP.NET MVC #### 1. MVC 中的 TempData\ViewBag\ViewData 区别? 在ASP.NET MVC中,TempData、ViewBag 和 ViewData 都是用于在控制器和视图之间传递数据的机制,但它们有一些区别。 <b>TempData:</b> 1、生命周期 ```c# TempData 的生命周期是短暂的,数据只在当前请求和下一次请求之间有效。一旦数据被读取,它就会被标记为已读,下一次请求时就会被清除。 ``` 2、用途 ```c# 主要用于在两个动作之间传递数据,例如在一个动作中设置 TempData,然后在重定向到另
95 5