zoukankan      html  css  js  c++  java
  • Cookie 知识点收集

    由于要写一个登陆认证过程,网上查半天没什么头绪,索性从Cookie的基础知识了解起,现对Cookie的知识点收集如下,方便以后查阅,O(∩_∩)O!
    1:cookie是在客户端存储用户信息的一个小文件,一般文件大小不超过4096 字节,大多数站点一般只允许每个站点存储 20 个 Cookie,如果超过,系统将会自动覆盖。
     
    2:Cookies的工作原理:第一次是由服务器端写入到客户端的系统中。以后每次访问这个网页,都是先由客户端将Cookies发送到服务器端,再由服务器端进行判断,然后再产生
      HTML代码返回给客户端,这是一个很重要的原理。
     
    3:cookie的存储形式:是以名/值对的形式保存下来的  UserID A9A3BECE0563982D www.goto.com/ 
      创建 Cookie 时,需要指定 Name 和 Value。每个 Cookie 必须有一个唯一的名称,以便以后从浏览器读取 Cookie 时可以识别它。
     
    4:如果没有设置 Cookie 的有效期,仍会创建 Cookie,但不会将其存储在用户的硬盘上。而会将 Cookie 作为用户会话信息的一部分进行维护。当用户关闭浏览器时,Cookie 便
      会被丢弃。  cookie机制采用的是在客户端保持状态的方案,而session机制采用的是在服务器端保持状态的方案。
     
    Cookie的属性: 
      Domain(域名):获得或设置与cookie有关的域名,可用于限制特定区域的cookie访问。       
          默认情况下设置为创建网页所在的服务器主机名。若设置为“.lwx.com”,那么在这个域的服务器都可使用,如www.lwx.comwww.2008.lwx.com都可以使用;
      Expires(期限):获得或设置cookie的终止日期和时间,你可以将其设置为一个过去的日期以自动终止或者删除cookie。(已经过时的属性,被max-age取代)
      max-age:cookie生命期属性(使用秒为单位);
      Names(名称):获得或设置cookie名称。
      Path(路径):获得或设置cookie的虚拟路径。这一属性允许你限制cookie范围,也就是说,访问cookie只能限制于一个特定的文件夹或者路径。设置这一属性限制为只能访问特定
          路径和该路径下的所有文件。设置为“/”对于网页所在服务器上的网页可见。
      Secure(安全):安全属性。发信号以表示是否使用Secure Sockets Layer (SSL)来发送cookie值。默认情况下是不安全的,设置为安全,cookie只能在浏览器和服务器通过
          HTTPS或其他安全协议链接时进行传输;
      Value(值):获得或设置一个单独的cookie值。
      Values(信息):返回包含在cookie中的key/value的一个集合。
     注意:cookie的属性可以设置,但是无法读取,要修改只能把整个cookie读取出来,重新设置这些属性然后在添加!
     
    用户系统上的Cookie由浏览器负责管理。Cookie 通过 HttpResponse 对象发送到浏览器,该对象公开称为 Cookies的集合。
     
    Cookies的写入(Response)和读取(Request):
    第一种:直接设置值
      写入Cookies: Response.cookies("UserName")=Value ;//名、值对
      设置Cookies的时间: Response.cookies("Name").Expires = date+1,表示Cookies保存1天 /  Hour+8,表示Cookies保存8小时。
     
    第二种:创建对象实例,通过Add方法添加
      HttpCookie aCookie = new HttpCookie("lastVisit");
      aCookie.Value = DateTime.Now.ToString();
      aCookie.Expires = DateTime.Now.AddDays(1);
      Response.Cookies.Add(aCookie);
    此时,Cookies集合中写入了两个Cookie,一个名为UserName,另一个名为lastVisit。
     
    读取Cookies:
      string UserName=Request.Cookies("UserName");
     
    带子键的Cookies写入:
    一个Cookies,允许有多个名、值对,在一个 Cookie 中存储多个名称/值对。名称/值对称为子键相关或类似的信息放在一个 Cookie 中很方便,由于所有信息都在一个 Cookie 中,所以有效期之类的 Cookie 属性就适用于所有信息。(注意,如果要为不同类型的信息指定不同的到期日期,就应该把信息存储在单独的 Cookie 中。)这样就节省了Cookies的使用个数限制。  设置一个名为userInfo的Cookie,含有两个子键userName,lastVisit
    第一种:直接设置值
    Response.Cookies["userInfo"]["userName"] = "patrick";
    Response.Cookies["userInfo"]["lastVisit"] = DateTime.Now.ToString();
    Response.Cookies["userInfo"].Expires = DateTime.Now.AddDays(1);
     
    第二种:创建实例,Add添加
    HttpCookie aCookie = new HttpCookie("userInfo");
    aCookie.Values["userName"] = "patrick";
    aCookie.Values["lastVisit"] = DateTime.Now.ToString();
    aCookie.Expires = DateTime.Now.AddDays(1);
    Response.Cookies.Add(aCookie);
     
     设置Cookies的控制范围:
    通过path属性 设置Cookies的控制范围,一般一个站点中的每个页面都能获得该站点的所有 Cookie,如果要限制页面访问Cookies,通过两种方式设置 Cookie 的范围:
    将 Cookie 限制到某个文件夹或应用程序:
    HttpCookie appCookie = new HttpCookie("AppCookie");
    appCookie.Value = "written " + DateTime.Now.ToString();
    appCookie.Expires = DateTime.Now.AddDays(1);
    appCookie.Path = "/Application1";  //效果是 Cookie 只能用于Application1 文件夹或虚拟根目录中的页面来访问。
    Response.Cookies.Add(appCookie);
     
    设置Cookies的域范围:
    通过Domain属性设置Cookies的域范围
    Cookie 与特定域关联。例如,如果站点是 www.contoso.com,那么当用户向该站点请求任何页时,您编写的Cookie 就会被发送到服务器。(这可能不包括带有特定路径值的Cookie。)如果站点具有子域(例如,contoso.com、sales.contoso.com 和 support.contoso.com),则可以将 Cookie 与特定的子域关联。若要执行此操作,请设置 Cookie 的 Domain 属性:
    Response.Cookies["domain"].Value = DateTime.Now.ToString();
    Response.Cookies["domain"].Expires = DateTime.Now.AddDays(1);
    Response.Cookies["domain"].Domain = "support.contoso.com"; //Cookie 将仅可用于指定的子域中的页面
    如果:Response.Cookies["domain"].Domain = "contoso.com";//此时Cookies将被多个子域共享,sales.contoso.com 和 support.contoso.com都可以访问
     
    读取Cookie并显示在页面的方法
    if(Request.Cookies["userName"] != null)    //确保该 Cookie 存在
    Label1.Text = Server.HtmlEncode(Request.Cookies["userName"].Value);
    或  if(Request.Cookies["userName"] != null)
    {   
     HttpCookie aCookie = Request.Cookies["userName"];   
     Label1.Text = Server.HtmlEncode(aCookie.Value);
    }
    获取子键值的一种方法:
    if(Request.Cookies["userInfo"] != null)
    {    
    Label1.Text =  Server.HtmlEncode(Request.Cookies["userInfo"]["userName"]);   
     Label2.Text = Server.HtmlEncode(Request.Cookies["userInfo"]["lastVisit"]);
    }
    获取单个子键的另一种方法是获取子键集合,然后再按名称提取子键值:
    if(Request.Cookies["userInfo"] != null)
    {   
     //Cookie 中的子键被类型化为 NameValueCollection  子键类型的集合
    System.Collections.Specialized.NameValueCollection  UserInfoCookieCollection ;        
     UserInfoCookieCollection = Request.Cookies["userInfo"].Values;    //获取子键集合
    Label1.Text =  Server.HtmlEncode(UserInfoCookieCollection["userName"]); //获取子键集合中的单个子键值  
    Label2.Text =  Server.HtmlEncode(UserInfoCookieCollection["lastVisit"]);
    }
     
    读取 Cookie 集合
    有时,可能需要读取可供页面使用的所有 Cookie。
    HttpCookie aCookie; string str;
    for(int i=0; i<Request.Cookies.Count; i++)
    {   
    aCookie = Request.Cookies[i]; 
    str+=  "Cookie name = " + Server.HtmlEncode(aCookie.Name)         + "<br />";   
    str+="Cookie value = " + Server.HtmlEncode(aCookie.Value)        + "<br /><br />";
    }
    Label1.Text = str;
     
    读取带子键的Cookie集合
    如果 Cookie 有子键,则会以一个名称/值字符串来显示子键。可以读取 Cookie 的 HasKeys 属性,以确定 Cookie 是否有子键。如果有,则可以读取子键集合以获取各个子键名称和值。可以通过索引值直接从 Values 集合中读取子键值。相应的子键名称可在 Values 集合的 AllKeys 成员中获得,该成员将返回一个字符串数组。
    HttpCookie aCookie;
    for(int i=0; i<Request.Cookies.Count; i++)
    {   
       aCookie = Request.Cookies[i];   
      output.Append("Name = " + aCookie.Name + "<br />");   
      if(aCookie.HasKeys)    //确定Cookie是否有子键 
      {       
        for(int j=0; j<aCookie.Values.Count; j++)       
        {           
          subkeyName = Server.HtmlEncode(aCookie.Values.AllKeys[j]);    //获取子键名称       
          subkeyValue = Server.HtmlEncode(aCookie.Values[j]);           
          output.Append("Subkey name = " + subkeyName + "<br />");           
           output.Append("Subkey value = " + subkeyValue +  "<br /><br />");       
        }   
      }   
      else    //无子键则输出该Cookie的值  (名--值对)
      {       
        output.Append("Value = " + Server.HtmlEncode(aCookie.Value) +   "<br /><br />");   
      }
    }
    Label1.Text = output.ToString();
    或者,可将子键作为 NameValueCollection 对象提取 (子键集合)
      if (aCookie.HasKeys)   
    {       
    System.Collections.Specialized.NameValueCollection CookieValues = aCookie.Values; 子键集合,即子键名值对      
    string[] CookieValueNames = CookieValues.AllKeys;   //获取所有子键名集合
    for (int j = 0; j < CookieValues.Count; j++)       
    {           
    subkeyName = Server.HtmlEncode(CookieValueNames[j]);           
    subkeyValue = Server.HtmlEncode(CookieValues[j]);  //子键值         
    output.Append("Subkey name = " + subkeyName + "<br />");           
    output.Append("Subkey value = " + subkeyValue +   "<br /><br />");       
    }    }   
    else   
    { 无子键时,输出value}}
     
    修改和删除 Cookie
    修改 Cookie
    不能直接修改 Cookie。更改 Cookie 的过程涉及创建一个具有新值的新 Cookie,然后将其发送到浏览器来覆盖客户端上的旧版本 Cookie。下面更改存储用户对站点的访问次数的 Cookie 的值:
    int counter;
    if (Request.Cookies["counter"] == null)   
    counter = 0;
    else
    {   
    counter = int.Parse(Request.Cookies["counter"].Value);
    }
    counter++;
    Response.Cookies["counter"].Value = counter.ToString();  //创建一个具有新值的同名Cookie
    Response.Cookies["counter"].Expires = DateTime.Now.AddDays(1);
     
    删除 Cookie
    删除 Cookie(即从用户的硬盘中物理移除 Cookie)是修改 Cookie 的一种形式。由于 Cookie 在用户的计算机中,因此无法将其直接移除。但是,可以让浏览器来为您删除 Cookie。该技术是创建一个与要删除的 Cookie 同名的新 Cookie,并将该 Cookie 的到期日期设置为早于当前日期的某个日期。当浏览器检查 Cookie 的到期日期时,浏览器便会丢弃这个现已过期的 Cookie。下面的代码示例演示删除应用程序中所有可用 Cookie 的一种方法:
    HttpCookie aCookie;
    string cookieName;
    int limit = Request.Cookies.Count;
    for (int i=0; i<limit; i++){   
    cookieName = Request.Cookies[i].Name;   
     aCookie = new HttpCookie(cookieName);   
    aCookie.Expires = DateTime.Now.AddDays(-1); //早于当前的某个日期  
    Response.Cookies.Add(aCookie);}
    修改或删除子键修改单个子键的方法与创建它的方法相同,如下面的示例所示:
    Response.Cookies["userInfo"]["lastVisit"] = DateTime.Now.ToString();
    Response.Cookies["userInfo"].Expires = DateTime.Now.AddDays(1);
    若要删除单个子键,可以操作 Cookie 的 Values 集合,该集合用于保存子键。首先通过从 Cookies 对象中获取 Cookie 来重新创建 Cookie。然后您就可以调用 Values 集合的 Remove 方法,将要删除的子键的名称传递给 Remove 方法。接着,将 Cookie 添加到 Cookies 集合,这样 Cookie 便会以修改后的格式发送回浏览器。下面的代码示例演示如何删除子键。在此示例中,要移除的子键的名称在变量中指定。
    string subkeyName;  subkeyName = "userName";
    HttpCookie aCookie = Request.Cookies["userInfo"];
    aCookie.Values.Remove(subkeyName);  //aCookie.Values 子键集合移除单个子键
    aCookie.Expires = DateTime.Now.AddDays(1);
    Response.Cookies.Add(aCookie);

  • 相关阅读:
    REDIS缓存穿透,缓存击穿,缓存雪崩
    spring 自动装配
    SpringBoot @Condition
    【Azure 环境】在Azure虚拟机(经典) 的资源中,使用SDK导出VM列表的办法
    【Azure Developer】使用Microsoft Graph API 批量创建用户,先后遇见的三个错误及解决办法
    【Azure 环境】基于Azure搭建企业级内部站点, 配置私有域名访问的详细教程 (含演示动画)
    【Azure Function】Function App和Powershell 集成问题, 如何安装PowerShell的依赖模块
    【Azure 应用服务】Python3.7项目在引用pandas 模块后,部署报错 
    【Azure 应用服务】部署Azure Web App时,是否可以替换hostingstart.html文件呢?
    【Azure 应用服务】添加自定义域时,Domain ownership 验证无法通过 
  • 原文地址:https://www.cnblogs.com/absoluteli/p/13958138.html
Copyright © 2011-2022 走看看