码迷,mamicode.com
首页 > Web开发 > 详细

MVC-Cookie

时间:2019-10-04 18:36:15      阅读:106      评论:0      收藏:0      [点我收藏+]

标签:library   浏览器设置   test   returns   tostring   server   接受   简单   user   

什么是 Cookie?

Cookie 是一小段文本信息,伴随着用户请求和页面在 Web 服务器和浏览器之间传递。Cookie 包含每次用户访问站点时 Web 应用程序都可以读取的信息。

例如,如果在用户请求站点中的页面时应用程序发送给该用户的不仅仅是一个页面,还有一个包含日期和时间的 Cookie,用户的浏览器在获得页面的同时还获得了该 Cookie,并将它存储在用户硬盘上的某个文件夹中。

以后,如果该用户再次请求您站点中的页面,当该用户输入 URL 时,浏览器便会在本地硬盘上查找与该 URL 关联的 Cookie。如果该 Cookie 存在,浏览器便将该 Cookie 与页请求一起发送到您的站点。然后,应用程序便可以确定该用户上次访问站点的日期和时间。您可以使用这些信息向用户显示一条消息,也可以检查到期日期。

Cookie 与网站关联,而不是与特定的页面关联。因此,无论用户请求站点中的哪一个页面,浏览器和服务器都将交换 Cookie 信息。用户访问不同站点时,各个站点都可能会向用户的浏览器发送一个 Cookie;浏览器会分别存储所有 Cookie。

Cookie 帮助网站存储有关访问者的信息。一般来说,Cookie 是一种保持 Web 应用程序连续性(即执行状态管理)的方法。除短暂的实际交换信息的时间外,浏览器和 Web 服务器间都是断开连接的。对于用户向 Web 服务器发出的每个请求,Web 服务器都会单独处理。但是在很多情况下,Web 服务器在用户请求页时识别出用户会十分有用。例如,购物站点上的 Web 服务器跟踪每位购物者,这样站点就可以管理购物车和其他的用户特定信息。因此,Cookie 可以作为一种名片,提供相关的标识信息帮助应用程序确定如何继续执行。

使用 Cookie 能够达到多种目的,所有这些目的都是为了帮助网站记住用户。例如,一个实施民意测验的站点可以简单地将 Cookie 作为一个 Boolean 值,用它来指示用户的浏览器是否已参与了投票,这样用户便无法进行第二次投票。要求用户登录的站点则可以通过 Cookie 来记录用户已经登录,这样用户就不必每次都输入凭据。

大多数浏览器支持最大为 4096 字节的 Cookie。由于这限制了 Cookie 的大小,最好用 Cookie 来存储少量数据,或者存储用户 ID 之类的标识符。用户 ID 随后便可用于标识用户,以及从数据库或其他数据源中读取用户信息。(有关存储用户信息安全建议的信息,请参见下面的“Cookie 和安全性”一节。)

浏览器还限制站点可以在用户计算机上存储的 Cookie 的数量。大多数浏览器只允许每个站点存储 20 个 Cookie;如果试图存储更多 Cookie,则最旧的 Cookie 便会被丢弃。有些浏览器还会对它们将接受的来自所有站点的 Cookie 总数作出绝对限制,通常为 300 个。

您可能遇到的 Cookie 限制是用户可以将其浏览器设置为拒绝接受 Cookie。如果定义一个 P3P 隐私策略,并将其放置在网站的根目录中,则更多的浏览器将接受您站点的 Cookie。但是,您可能会不得不完全放弃 Cookie,而通过其他机制来存储用户特定的信息。存储用户信息的常用方法是会话状态,但会话状态依赖于 Cookie,这一点在后面的“Cookie 和会话状态”一节中说明。

浏览器负责管理用户系统上的 Cookie。Cookie 通过 HttpResponse 对象发送到浏览器,该对象公开称为 Cookies 的集合。可以将 HttpResponse 对象作为 Page 类的 Response 属性来访问。要发送给浏览器的所有 Cookie 都必须添加到此集合中。创建 Cookie 时,需要指定 Name 和 Value。每个 Cookie 必须有一个唯一的名称,以便以后从浏览器读取 Cookie 时可以识别它。由于 Cookie 按名称存储,因此用相同的名称命名两个 Cookie 会导致其中一个 Cookie 被覆盖。

还可以设置 Cookie 的到期日期和时间。用户访问编写 Cookie 的站点时,浏览器将删除过期的 Cookie。只要应用程序认为 Cookie 值有效,就应将 Cookie 的有效期设置为这一段时间。对于永不过期的 Cookie,可将到期日期设置为从现在起 50 年。

Note注意

用户可随时清除其计算机上的 Cookie。即便存储的 Cookie 距到期日期还有很长时间,但用户还是可以决定删除所有 Cookie,清除 Cookie 中存储的所有设置。

如果没有设置 Cookie 的有效期,仍会创建 Cookie,但不会将其存储在用户的硬盘上。而会将 Cookie 作为用户会话信息的一部分进行维护。当用户关闭浏览器时,Cookie 便会被丢弃。这种非永久性 Cookie 很适合用来保存只需短时间存储的信息,或者保存由于安全原因不应该写入客户端计算机上的磁盘的信息。例如,如果用户在使用一台公用计算机,而您不希望将 Cookie 写入该计算机的磁盘中,这时就可以使用非永久性 Cookie。

添加Cookie

Response.Cookies["userName"].Value = "patrick";
Response.Cookies["userName"].Expires = DateTime.Now.AddDays(1);//设置过期时间1天
HttpCookie aCookie = new HttpCookie("lastVisit");
aCookie.Value = DateTime.Now.ToString();
aCookie.Expires = DateTime.Now.AddDays(1);
Response.Cookies.Add(aCookie);

此示例向 Cookies 集合添加两个 Cookie,一个名为 userName,另一个名为 lastVisit。对于第一个 Cookie,Cookies 集合的值是直接设置的。可以通过这种方式向集合添加值,因为 Cookies 是从 NameObjectCollectionBase 类型的专用集合派生的。

对于第二个 Cookie,代码创建了一个 HttpCookie 类型的对象实例,设置其属性,然后通过 Add 方法将其添加到 Cookies 集合。在实例化 HttpCookie 对象时,必须将该 Cookie 的名称作为构造函数的一部分进行传递。

这两个示例都完成了同一任务,即向浏览器写入一个 Cookie。在这两种方法中,有效期值必须为 DateTime 类型。但是,lastVisited 值也是日期时间值。因为所有 Cookie 值都存储为字符串,因此,必须将日期时间值转换为 String。

多值 Cookie

Response.Cookies["userInfo"]["userName"] = "patrick";
Response.Cookies["userInfo"]["lastVisit"] = DateTime.Now.ToString();
Response.Cookies["userInfo"].Expires = DateTime.Now.AddDays(1);
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);

读取 Cookie

浏览器向服务器发出请求时,会随请求一起发送该服务器的 Cookie。在 ASP.NET 应用程序中,可以使用 HttpRequest 对象读取 Cookie,该对象可用作 Page 类的 Request 属性使用。HttpRequest 对象的结构与 HttpResponse 对象的结构基本相同,因此,可以从 HttpRequest 对象中读取 Cookie,并且读取方式与将 Cookie 写入 HttpResponse 对象的方式基本相同。下面的代码示例演示两种方法,通过这两种方法可获取名为 username 的 Cookie 的值,并将其值显示在 Label 控件中:

if(Request.Cookies["userName"] != null)
Label1.Text = Server.HtmlEncode(Request.Cookies["userName"].Value);
if(Request.Cookies["userName"] != null)
{
HttpCookie aCookie = Request.Cookies["userName"];
Label1.Text = Server.HtmlEncode(aCookie.Value);
}

在尝试获取 Cookie 的值之前,应确保该 Cookie 存在;如果该 Cookie 不存在,将会收到 NullReferenceException 异常。还请注意在页面中显示 Cookie 的内容前,先调用 HtmlEncode 方法对 Cookie 的内容进行编码。这样可以确保恶意用户没有向 Cookie 中添加可执行脚本。有关 Cookie 安全性的更多信息,请参见“Cookie 和安全性”一节。


获取子键值的一种方法:

if(Request.Cookies["userInfo"] != null)
{
Label1.Text =
Server.HtmlEncode(Request.Cookies["userInfo"]["userName"]);
Label2.Text =
Server.HtmlEncode(Request.Cookies["userInfo"]["lastVisit"]);
}

在上面的示例中,代码读取子键 lastVisit 的值,该值先前被设置为字符串表示形式的 DateTime 值。Cookie 将值存储为字符串,因此,如果要将 lastVisit 值作为日期使用,必须将其转换为适当的类型,如此示例所示:

DateTime dt;
dt = DateTime.Parse(Request.Cookies["userInfo"]["lastVisit"]);

修改和删除 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();
Response.Cookies["counter"].Expires = DateTime.Now.AddDays(1);//浏览器检测到过期会自动删除cookie,就像借刀杀人-_-

删除 Cookie

删除 Cookie(即从用户的硬盘中物理移除 Cookie)是修改 Cookie 的一种形式。由于 Cookie 在用户的计算机中,因此无法将其直接移除。但是,可以让浏览器来为您删除 Cookie。该技术是创建一个与要删除的 Cookie 同名的新 Cookie,并将该 Cookie 的到期日期设置为早于当前日期的某个日期。当浏览器检查 Cookie 的到期日期时,浏览器便会丢弃这个现已过期的 Cookie。下面的代码示例演示删除应用程序中所有可用 Cookie 的一种方法:

aCookie.Expires = DateTime.Now.AddDays(-1);//浏览器检测到过期会自动删除cookie,就像借刀杀人-_-
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.Expires = DateTime.Now.AddDays(1);
Response.Cookies.Add(aCookie);
Cookie对象是服务器为用户访问存储的特定信息,这些信息一般存储在浏览器中,服务器可以从提交的数据中获取到相应的Cookie信息,Cookie的最大用途在于服务器对用户身份的确认,即票据认证,用户会话分配的SessionId会存储在Cookie中,通过这个Cookie中的SessionId可以提供用户全局性访问该网站。

一般Cookie对象可以为用户存储一些简单的非机密性的信息,如用户的登录时间等信息。

Cookie对象常见属性有:

(1)Response.Cookie.Keys:获取Cookie变量名或者根据其索引获取变量值

(2)Response.Cookies.Count:获取Cookie变量的数量

(3)Response.Cookies.AllKeys:将Cookies对象中所有的变量名存储到数组中。

Cookie对象的常用方法有:

(1)Response.Cookies.Set:用于更新Cookie的变量值

(2)Response.Cookies.Remove:用于删除Cookie变量

(3)Response.Cookies.Get:用Cookie变量名称或者索引值获取变量值。

(4)Response.Cookies.Clear:清除Cookie内所有的变量

(5)Response.Cookies.Add:用于Cookie对象中添加Cookie变量。

 

创建一个Cookie对象并输出到浏览器可使用以下语句实现:

 HttpCookie cookie_t = new HttpCookie("Test");//创建一个名称为Test的Cookie对象

 cookie_t.Value = "测试数据";   //设置cookie的值

 Response.Cookies.Add(cookie_t);

如果要更新上述Cookie的值可采用下列方法:

  cookie_t.Value = "更新cookie数据";
  Response.Cookies.Set(cookie_t);//更新Cookie的值

移除cookie_t可采用 Response.Cookies.Remove("Test");即可移除Cookie数据。
创建cookie

方法1:

Response.Cookies["username"].value="mike";
Response.Cookies["username"].Expires=DateTime.MaxValue;?
方法2:

HttpCookie acookie = new HttpCookie("username");
acookie.Value="mike";
acookie.Expires=DateTime.MaxValue; 
Response.Cookies.Add(acookie);
创建多值cookie

方法1:

Response.Cookies["login"]["username"].value="mike";
Response.Cookies["login"]["password"].value="123456";
Response.Cookies["login"].Expires=DateTime.MaxValue; //有效时间设置为最长?
方法2:

HttpCookie cookie = new HttpCookie("login");
cookie.Values["username"]="mike";
cookie.Values["password"]="123456";
cookie.Expires= System.DateTime.Now.AddDays(1);//设置过期时间  1天
Response.Cookies.Add(cookie);
Cookie读取

stringstr = Request.Cookies("userName").Value; 
Cookie多值读取
if (Request.Cookies["login"]!=null )
{
string name=Request.Cookies["login"]["username"];
string password =Request.Cookies["login"]["password"]; 
}
Cookie删除

? ?通过Expires设置过期时间即可,如

cookie.Expires=DateTime.Now.AddDays(-30);
————————————————
版权声明:本文为CSDN博主「steven-zx」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/leimengyuanlian/article/details/9419585

练习:action里操作cookie

        public JsonResult Select()
        {

            
            HttpCookie co = new HttpCookie("cc");

            co.Values.Add("m1","m11");
            co.Values.Add("m2", "m22");
            co.Values.Add("m3", "m33");
            Debug.WriteLine(co.Values["m1"]);
            Debug.WriteLine(co.Values["m2"]);
            Response.AppendCookie(co);//向客户端发送cookie
            var fk= Request.Cookies["ASP.NET_SessionId"];//获取客户端返回的cookie

            var Jsonlist = library.GetList().ToList();//全查

            return Json(Jsonlist);
        }

前端操作cookie

1..cshtml页面

<script type="text/javascript">
document.cookie = "456123";//添加cooki
</script>

2.js操作cookie----借鉴思路

// 我们定义一个函数,用来读取特定的cookie值。[得到指定名字的cookie对象哦!]
function getCookie(cookie_name)
{
var allcookies = document.cookie;
var cookie_pos = allcookies.indexOf(cookie_name);

// 如果找到了索引,就代表cookie存在,
// 反之,就说明不存在。
if (cookie_pos != -1)
{
// 把cookie_pos放在值的开始,只要给值加1即可。
cookie_pos += cookie_name.length + 1;
var cookie_end = allcookies.indexOf(";", cookie_pos);

if (cookie_end == -1)
{
cookie_end = allcookies.length;
}

var value = unescape(allcookies.substring(cookie_pos, cookie_end));
}

return value;
}

// 调用函数
var cookie_val = getCookie("username");

cookie帮助类--CookieHelper

using System;
using System.Web;

namespace *****
{
    /// <summary>
    /// Cookie帮助类
    /// </summary>
    public class CookieHelper
    {
        /// <summary>
        /// 删除指定名称的Cookie
        /// </summary>
        /// <param name="name">Cookie名称</param>
        public static void DeleteCookie(string name)
        {
            try
            {
                HttpCookie cookie = new HttpCookie(name);
                cookie.Expires = DateTime.Now.AddYears(-1);
                HttpContext.Current.Response.AppendCookie(cookie);
            }
            catch (Exception e)
            {
                throw e;
            }
        }

        /// <summary>
        /// 获得指定名称的Cookie值
        /// </summary>
        /// <param name="name">Cookie名称</param>
        /// <returns></returns>
        public static string GetCookie(string name)
        {
            try
            {
                HttpCookie cookie = HttpContext.Current.Request.Cookies[name];
                if (cookie != null)
                    return cookie.Value;

            }
            catch (Exception e)
            {
                throw e;
            }

            return string.Empty;
        }

        /// <summary>
        /// 获得指定名称的Cookie中特定键的值
        /// </summary>
        /// <param name="name">Cookie名称</param>
        /// <param name="key">键</param>
        /// <returns></returns>
        public static string GetCookie(string name, string key)
        {
            try
            {
                HttpCookie cookie = HttpContext.Current.Request.Cookies[name];
                if (cookie != null && cookie.HasKeys)
                {
                    string v = cookie[key];
                    if (v != null)
                        return v;
                }
            }
            catch (Exception e)
            {
                throw e;
            }
            return string.Empty;
        }

        /// <summary>
        /// 设置指定名称的Cookie的值
        /// </summary>
        /// <param name="name">Cookie名称</param>
        /// <param name="value">值</param>
        public static void SetCookie(string name, string value)
        {
            try
            {
                HttpCookie cookie = HttpContext.Current.Request.Cookies[name];
                if (cookie != null)
                    cookie.Value = value;
                else
                    cookie = new HttpCookie(name, value);
                HttpContext.Current.Response.AppendCookie(cookie);
            }
            catch (Exception e)
            {
                throw e;
            }
        }

        /// <summary>
        /// 设置指定名称的Cookie的值
        /// </summary>
        /// <param name="name">Cookie名称</param>
        /// <param name="value">值</param>
        /// <param name="expires">过期时间</param>
        public static void SetCookie(string name, string value, double expires)
        {
            try
            {
                HttpCookie cookie = HttpContext.Current.Request.Cookies[name];
                if (cookie == null)
                    cookie = new HttpCookie(name);

                cookie.Value = value;
                cookie.Expires = DateTime.Now.AddMinutes(expires);
                HttpContext.Current.Response.AppendCookie(cookie);
            }
            catch (Exception e)
            {
                throw e;
            }
        }

        /// <summary>
        /// 设置指定名称的Cookie特定键的值
        /// </summary>
        /// <param name="name">Cookie名称</param>
        /// <param name="key">键</param>
        /// <param name="value">值</param>
        public static void SetCookie(string name, string key, string value)
        {
            try
            {
                HttpCookie cookie = HttpContext.Current.Request.Cookies[name];
                if (cookie == null)
                    cookie = new HttpCookie(name);

                cookie[key] = value;
                HttpContext.Current.Response.AppendCookie(cookie);
            }
            catch (Exception e)
            {
                throw e;
            }
        }

        /// <summary>
        /// 设置指定名称的Cookie特定键的值
        /// </summary>
        /// <param name="name">Cookie名称</param>
        /// <param name="key">键</param>
        /// <param name="value">值</param>
        /// <param name="expires">过期时间</param>
        public static void SetCookie(string name, string key, string value, double expires)
        {
            try
            {
                HttpCookie cookie = HttpContext.Current.Request.Cookies[name];
                if (cookie == null)
                    cookie = new HttpCookie(name);

                cookie[key] = value;
                cookie.Expires = DateTime.Now.AddMinutes(expires);
                HttpContext.Current.Response.AppendCookie(cookie);
            }
            catch (Exception e)
            {
                throw e;
            } 
        }


    }
}

MVC-Cookie

标签:library   浏览器设置   test   returns   tostring   server   接受   简单   user   

原文地址:https://www.cnblogs.com/jsll/p/11622647.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!