3.通过cookie实现客户端与服务器端的通信
(1)cookie的信息组成一个cookie通常由以下部分组成(各部分信息以;分割):
cookie_name=cookie_value;expires=expiration_time;path=domain_path;domain=domain_name;
cookie的名称不区分大小写,是cookie的唯一标识。
cookie_value为字符串值。在存储之前使用encodeURIComponent()进行编码。名称和值加起来的字节数不能超过4095字节,即4kb。
出于安全考虑,网站不能访问由其他域创建的cookie。也可以覆盖这个设置以允许另一个网站访问这个cookie。
路径限制了对web服务器上的特定目录的访问。例如,可指定cookie只能从http://www.microsoft.com/cn中访问,这样就不能访问http://www.microsoft.com上的网页了。
失效日期用于指明cookie何时应该被删除。默认情况下,关闭浏览器时,即将cookie删除。必须是GMT格式的日期(可以使用Date对象的toGMTString()方法)。如果设置的失效日期是个过去的日期,则cookie被立刻删除。
安全标志是以个true/false值,用于表示cookie是否只能从安全网站(使用SSL和https协议的网站)中访问。可以将这个值设置为true以提供加强的保护.
例:LoginUserID=sa;expires=Mon, 30 Jan 2012 16:00:00 UTC
(2)cookie的安全限制每个域最多只能在一台用户的机器上存储20个cookie;
每个cookie的总尺寸不能超过4096字节;
一台用户的机器上的cookie总数不能超过300个。
(3)使用javascript添加或修改cookie给document.cookie赋值就添加或修改了一个cookie。
例:document.cookie = “LoginUserID=sa”;
Document.cookie=”LastLoginDate=”+encodeURIComponent(“ 2010-01-01 10:00”);
通常创建一个函数用于添加cookie,如:
function setCookie(cookieName, cookieValue, cookieExpires, cookiePath, cookieDomain, cookieSecure) {
var newCookie = cookieName + "=" + encodeURIComponent(cookieValue);
if (cookieExpires!=null) {
newCookie = newCookie + ";expires=" + cookieExpires.toGMTString();
}
if (cookiePath != null) {
newCookie = newCookie + ";path=" + cookiePath;
}
if (cookieDomain != null) {
newCookie = newCookie + ";domain=" + cookieDomain;
}
if (cookieSecure != null) {
newCookie = newCookie + ";secure";
}
document.cookie = newCookie;
}
(4)使用javascript获取cookiefunction getCookie(cookieName) {
var cookies = document.cookie;
if (cookies != null) {
cookies = decodeURIComponent(cookies); //解码
var cookieList = cookies.split(";");
for (var i = 0; i < cookieList.length; i++) {
if (cookieList[i].toLowerCase().indexOf(cookieName.toLowerCase() + "=") == 0) {
return cookieList[i];
}
}
}
return null;
}
(5)使用javascript删除cookie可以通过设置失效日期为一个过去的日期来删除cookie
function deleteCookie(cookieName) {
var newCookie = cookieName + "='';expires=" + (new Date(0)).toGMTString();
document.cookie = newCookie;
}
(6)使用javascript删除所有cookie
function deleteCookies() {
var cookies = document.cookie;
var newCookie = "";
var equalIndex = -1;
if (cookies != null) {
cookies = decodeURIComponent(cookies); //解码
var cookieList = cookies.split(";");
for (var i = 0; i < cookieList.length; i++) {
equalIndex = cookieList[i].toLowerCase().indexOf("=");
if (equalIndex > 0) {
newCookie = cookieList[i].substring(0, equalIndex) + "='';expires=" + (new Date(0)).toGMTString();
document.cookie = newCookie;
}
}
}
}
(7)使用ASP.NET添加或修改cookie在asp.net中可以使用Response.Cookies.Add(HttpCookie newCookie)或Response.SetCookie(HttpCookie newCookie)来添加或修改cookie
protected void SetCookie(string cookieName, string cookieValue, DateTime cookieExpires, string cookiePath, string cookieDomain, bool cookieSecure)
{
HttpCookie newCookie = new HttpCookie(cookieName,cookieValue);
newCookie.Expires = cookieExpires;
newCookie.Path = cookiePath;
newCookie.Domain = cookieDomain;
newCookie.Secure = cookieSecure;
Response.Cookies.Add(newCookie);
}
(7)使用ASP.NET获取cookie在asp.net中可以通过读取Request.Cookies获取所有Cookie或指定Cookie。
protected void btnGetAllCookieServer_Click(object sender, EventArgs e)
{
StringBuilder cookieString = new StringBuilder();
HttpCookie hc;
for (int i=0;i < Request.Cookies.Count;i++)
{
hc = Request.Cookies[i];
cookieString.Append("Name=" + hc.Name + ";Value=" + hc.Value + ";Expires=" + hc.Expires.ToString("yyyy-MM-dd hh:mm:ss") + ";Path=" + hc.Path + ";Domain=" + hc.Domain + ";Secure=" + hc.Secure.ToString()+";");
}
if (cookieString.Length > 0)
{
ScriptManager.RegisterClientScriptBlock(this, this.GetType(), "GetCookies1","alert('" + cookieString.ToString() + "');",true);
}
}
(8)在ASP.NET删除cookie注意:不要直接循环Request.Cookies,因为那样需要N*2次循环
int cookieCount = Request.Cookies.Count;
for (int i = 0; i < cookieCount; i++)
{
HttpCookie hc = new HttpCookie(Request.Cookies[i].Name);
hc.Expires = DateTime.Now.AddDays(-1);
Response.SetCookie(hc);
}
(9)客户端与服务器端cookie的通信通常是在服务器端检查是否需要写cookie(如记住我),如果需要则添加cookie,在客户端onload事件中获取cookie并给html元素赋值。ckRh埦?_剉&