栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > asp

Cookies的各方面知识(基础/高级)深度了解

asp 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Cookies的各方面知识(基础/高级)深度了解

一,前言

cookies想必所有人都了解, 但是未必所有人都精通。本文讲解了cookies的各方面知识。

二,基础知识

1.什么是cookies

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 来记录用户已经登录,这样用户就不必每次都输入凭据。

2.cookies如何存储

cookies保存在用户的本地机器上,不同的浏览器存储在不同的文件夹中,并且按照域名分别保存。即网站之间的cookies不会彼此覆盖。

IE浏览器的用户可以通过在本地的文档中找到cookies的txt文件, 不同操作系统的位置不同,windows server 2003/xp都保存在:

C:documents and SettingsAdministratorcookies 文件夹下。

其中名称txt按照域名保存,比如localhost域下的cookies为:

administrator@localhost[1].txt 或者 administrator@localhost[2].txt

其中后面的[1]和[2]是随着每次保存交替变化的。

3.cookies如何传递

cookies的信息是在Web服务器和浏览器之间传递的。保存在Http请求中。

(1)请求页面

在请求一个页面的Http头中,会将属于此页面的本地cookies信息加在Http头中,注意下面加粗的部分:
复制代码 代码如下:
GET /cookies/Test.aspx HTTP/1.1
Host: localhost:1335
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.2; zh-CN; rv:1.9.1.1) Gecko/20090715 Firefox/3.5.1 GTB5 (.NET CLR 3.5.30729)
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*}.csharpcode pre { margin: 0em; }.csharpcode .rem { color: #008000; }.csharpcode .kwrd { color: #0000ff; }.csharpcode .str { color: #006080; }.csharpcode .op { color: #0000c0; }.csharpcode .preproc { color: #cc6633; }.csharpcode .asp { background-color: #ffff00; }.csharpcode .html { color: #800000; }.csharpcode .attr { color: #ff0000; }.csharpcode .alt {background-color: #f4f4f4;width: 100%;margin: 0em;}.csharpcode .lnum { color: #606060; }

上面的字符串包含了两个cookies,一个是不包含子键的SingleKey, 一个是包含pkid和TextValue两个子键的My.Common.SubKey,两个cookie通过“;”分割。

(3)Asp.Net中的cookies格式

和所有的服务器端语言一样,Asp.Net中使用集合类保存cookies集合:
复制代码 代码如下:
public sealed class HttpcookieCollection : NameObjectCollectionbase
{...}

通过HttpResquest和HttpResponse对象的cookies属性,可以获取和写入当前页面的cookies。

3.cookies的内容编码格式

cookies的值中可以保存除了“;”以外的标点符号。但是不能保存汉字。保存汉字会出现乱码。

所以对于cookies中的内容要进行统一的编码和解码。为了在浏览器端和服务器端都能够进行解码和编码, 所以要统一使用UTF编码格式。

主要是因为javascript中只能使用UTF编码格式。

4.cookies的Path属性

cookies的Path属性表示当前的cookies可以作用在网站的那个路径下。

比如下面的两个同名的cookies:

允许存在两个同名但是Path不同的cookies。

无论是服务器端还是客户端,在获取时优先获取本页路径下面的cookies。

也就是说如果在、/chapter10/路径下面的页面, 获取testKey这个cookies的值,则只能获取到testValue222222这个值。

5.cookies的过期时间

如果保存cookies时未设置过期时间, 则cookies的过期时间为“当前浏览器进程有效”,即和Session一样关闭浏览器后则消失。在asp.net中还可以通过设置Httpcookie对象的过期时间为DateTime.MinValue来指定此cookies为跟随浏览器生效。(这句话来之不易啊,在脑袋等人的帮助下才查到的。)

如果设置了过期时间并且大于当前时间,则会保存cookies值。

如果设置了过期时间但是小于等于当前时间,则清除cookies值。

6.cookies与Session

有时我们会忽略cookies与Session的关系。但是两者是密不可分的。

Session的唯一标示:SessionID是通常保存在cookies中的(也可以保存在URL中)。对于Asp.Net而言,SessionID保存在键值为“ASP.NET_SessionId”的cookies中,如图:

因为cookies的存储数量是有限制的,所以我们的系统在保存cookies的时候一定要注意防止冲掉这一个关键的cookies。在下文介绍的最佳实践-以强对象方式保存cookies的代码中特意对这个cookies做了处理。

7.cookies加密

在设置cookies的属性时,有一个选项Secure用来控制cookie的加密特性。

如果通过 SSL 连接 (HTTPS) 传输 cookie,则为 true;否则为 false。默认为 false。

如果我们保存一个cookies并设置加密,那么在非HTTPS的页面中,无论是使用javascript还是服务器端都无法获得此cookies。但是在本地依然可以看到此cookies的存在。

8.cookies与Ajax

如果Ajax请求访问一个服务器页面,此服务器页面是可以向用户浏览器写入cookies和Session的。

四. cookies最佳实践

在了解了cookies的相关知识后,下面提出最佳的事件方法。其中包括客户端和服务器端两部分。

(1)Asp.Net 中保存cookies

通常,我们使用Request和Response对象来直接操作cookies:

写入cookies:
复制代码 代码如下:
Response.cookies["k1"].Value = "k1Value";
Response.cookies["k2"]["k2-1"] = "k2-1Value";
Response.cookies.Add(new Httpcookie("k3", "k3Value"));

读取cookies:
复制代码 代码如下:
Request["k1"] ;
Request.cookies["k1"].Value ;
Request.cookies["k2"]["k2-1"];
Request.cookies.Get(0).Value;

注意Request["k1"]这个大家熟悉的获取get和post参数的方法,同时还能够获取cookies的值!

另外上面语句中的有些是必须通过Value属性访问的,有些则不需要。

(2)以对象方式保存cookies

下面提供一个可以以对象方式整体保存cookies的工具类。并且只占用一条cookies,所有的属性都存在子键上。

源代码:
复制代码 代码如下:
///


/// cookies基类。将需要保存cookies的数据类此类派生,可以将强类型对象在cookies中的保存和读取。
///

///
/// 2009.8.6 ziqiu.zhang created
///

///
/// 假设MycookiesInfo是从 从cookies中获取对象:
///
/// cookieInfo item = new cookieInfo(); //new以后已经从cookies中构造了对象。
///
/// 将对象保存在cookies中:
///
/// cookieInfo item = new cookieInfo();
/// item.value = "test value";
/// item.Setcookies("1"); //cookies有效期为1天
///
///

[System.Serializable]
public class cookieInfo
{
#region ==================== Constructed Method ====================
///
/// 构造函数
///

public cookieInfo()
{
}
#endregion
#region ==================== Public Method ====================
///
/// 得到当前cookies的过期时间
///

/// 过期时间
public DateTime GetExpiresTime()
{
string cookieName = GetType().ToString();
if (HttpContext.Current.Request.cookies[cookieName] != null)
{
return HttpContext.Current.Request.cookies[cookieName].Expires;
}
return DateTime.MinValue;
}
///
/// 保存cookies,过期时间为浏览器关闭则失效。
///

/// cookies过期事件
/// 是否保存成功
public bool Save()
{
return this.Save(DateTime.MinValue);
}
///
/// 保存cookies,需要指定过期时间。
///

/// cookies过期事件
/// 是否保存成功
public bool Save(DateTime expiresTime)
{
string cookieName = GetType().ToString();
Httpcookie Sessioncookie = null;
//对 SessionId 进行备份.
if (HttpContext.Current.Request.cookies["ASP.NET_SessionId"] != null)
{
string SesssionId = HttpContext.Current.Request.cookies["ASP.NET_SessionId"].Value.ToString();
Sessioncookie = new Httpcookie("ASP.NET_SessionId");
Sessioncookie.Value = SesssionId;
}
//设定cookie 过期时间.
DateTime dtExpiry = expiresTime;
HttpContext.Current.Response.cookies[cookieName].Expires = dtExpiry;
//设定cookie 域名.
string domain = string.Empty;
if (HttpContext.Current.Request.Params["HTTP_HOST"] != null)
{
//domain = "www.elong.com";
domain = HttpContext.Current.Request.Params["HTTP_HOST"].ToString();
}
//如果是www.elong.com或多级域名,需要转化为elong.com
if (domain.IndexOf(".") > -1)
{
string[] temp = domain.Split('.');
if (temp.Length >= 3)
{
domain = temp[temp.Length - 2].Trim() + "." + temp[temp.Length - 1].Trim();
}
HttpContext.Current.Response.cookies[cookieName].Domain = domain;
}
//把类的属性, 写入cookie.
PropertyInfo[] Propertys = GetType().GetProperties();
foreach (PropertyInfo pi in Propertys)
{
object oj = pi.GetValue(this, null);
Type type = pi.PropertyType;
string valueStr = string.Empty;
if (oj != null && oj.ToString() != string.Empty)
{
if (type == Type.GetType("System.DateTime"))
{
valueStr = ((DateTime)oj).ToString("yyyy/MM/dd HH:mm:ss", System.Globalization.DateTimeFormatInfo.InvariantInfo);
}
else
{
valueStr = oj.ToString();
}
HttpContext.Current.Response.cookies[cookieName][pi.Name] = HttpUtility.UrlEncode(valueStr);
}
}
//如果cookie总数超过20 个, 重写ASP.NET_SessionId, 以防Session 丢失.
if (HttpContext.Current.Request.cookies.Count > 20 && Sessioncookie != null)
{
if (Sessioncookie.Value != string.Empty)
{
HttpContext.Current.Response.cookies.Remove("ASP.NET_SessionId");
HttpContext.Current.Response.cookies.Add(Sessioncookie);
}
}
return true;
}
///
/// 找回cookie值
///

public void Load()
{
string cookievalue = string.Empty;
string cookieName = GetType().ToString();
//通过遍历属性, 从cookie 中找回值, 回写到属性.
PropertyInfo[] Propertys = GetType().GetProperties();
foreach (PropertyInfo pi in Propertys)
{
try
{
cookievalue = HttpUtility.UrlDecode(HttpContext.Current.Request.cookies[cookieName][pi.Name].ToString());
}
catch
{
cookievalue = string.Empty;
}
if (pi.CanWrite && cookievalue != null && cookievalue != string.Empty)
{
try
{
object obb = cookievalue;
Type type = pi.PropertyType;
obb = Convert.ChangeType(obb, type);
pi.SetValue(this, obb, null);
}
catch { }
}
}
}
#endregion
}


使用

首先说明如何使用此类。

为想要保存在cookies中的类建立模型,并且继承自cookieInfo即可。比如下面建立了MycookieInfo类,其中包含属性pkid,TestValue和TestDateTime:
复制代码 代码如下:
///


/// 保存cookies的数据对象
///

[System.Serializable]
public class MycookieInfo : cookieInfo
{
private int m_Pkid = 0;
public int Pkid
{
get
{
return m_Pkid ;
}
set
{
m_Pkid = value ;
}
}

private string m_TestValue = "";
public string TestValue
{
get
{
return m_TestValue;
}
set
{
m_TestValue = value;
}
}

private DateTime m_TestDateTime = DateTime.Now;
public DateTime TestDateTime
{
get
{
return m_TestDateTime;
}
set
{
m_TestDateTime = value;
}
}
}

接下来就可以使用对象的Save和Load方法保存和读取cookies:
复制代码 代码如下:
•保存
Save方法有两个重载,不带参数的Save方法表示cookies的过期时间与浏览器相同,即浏览器关闭则cookies消失。否则需要传入cookies过期时间。
MycookieInfo testcookies = new MycookieInfo();
testcookies.Pkid = 1;
testcookies.TestValue = "中文测试";
testcookies.Save(); •读取

MycookieInfo testcookies = new MycookieInfo();
testcookies.Load();
this.lblMsg.Text = "Pkid:" + testcookies.Pkid.ToString();
this.lblMsg.Text += ",TestValue:" + testcookies.TestValue.ToString();
this.lblMsg.Text += ",TestDateTime:" + testcookies.TestDateTime.ToString("yyyy/MM/dd HH:mm:ss", System.Globalization.DateTimeFormatInfo.InvariantInfo);

现在我们已经可以将一个强类型的对象读取和保存cookies了。
(3)使用Javascript操作cookies

在客户端我们同样需要操作cookies。

下面是封装了的专门用于操作cookies的jQuery工具函数。
当然此工具函数稍加修改,就可以变成标准的Javascript函数。

下载地址

工具函数说明:

方法签名: jQuery.cookie(name, subName, value,  options)

方法说明:读取、写入、删除cookies

方法参数:

名称 说明 举例
name cookies的主键值 读取主键:
$.cookie("singleKey")

写入cookies,值为字符串:
$.cookie("singleKey", "", "singleKey-value", { expires: 1, path: "/", secure: false })
subName 子键名称。在写入时请传递空或者null 读取子键:
$.cookie("multiKey", "subName1")

写入cookies,值为对象:
var subNameObj = { subName1: "aaa", subName2: "bbb", subName3: "ccc" };$.cookie("multiKey", "", subNameObj, { expires: 1, path: "/", secure: false });
value cookies值,可以是字符串或者对象。
如果是对象,则将对象的每个属性保存在cookies子键。
参见上面实例。
options 参数:
expires:可以是数字或者Data类型的对象。
如果传入数字表示几天后过期。
path:路径,默认为域名根目录(“/”)。
secure:是否启用加密,默认为否。

指定过期时间:

var myDate = new Date();myDate.setFullYear(2009, 10, 10);$.cookie("singleKey", "", "singleKey-value", { expires: myDate, secure: false })  

1天后过期:

var time = Date();$.cookie("singleKey", "", "singleKey-value", { expires: 1, path: "/", secure: false })
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/58057.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号