Cookie的小知识
Cookie
Cookie是保存在客戶端的名稱/值的字符串對。當(dāng)前瀏覽器從服務(wù)器響應(yīng)中接收到Set-Cookie Http頭時,就會設(shè)置Cookie,稍后如果請求的URL與該Cookie相關(guān)的Path以及domain的
限制匹配時,瀏覽器會將該Cookie發(fā)送回服務(wù)器。
設(shè)置會話Cookie:
protected void page_load(object sender,EventArgs e)
{
??? HttpCookie cookie = new HttpCookie("name");
??? cookie.Value = "value";
??? this.Response.AppendCookie(cookie);
}
上面的Cookie,因?yàn)闆]有設(shè)置過期時間,這個Cookie會一直保持到瀏覽器關(guān)閉。
在JavaScript創(chuàng)建Cookie:
function SetCookie(name,value){
??? document.cookie = name +'='+escape(value);
}
單個Cookie中多個名稱/值對:
HttpCookie cookie = new HttpCookie("name");
cookie.Vlaues["V1"] = "va1";
cookie.Vlaues["V2"] = "va2";
創(chuàng)建會生成一個單獨(dú)的Cookie,保存形式:name=v1=va1&v2=va2
Cookie屬性
除了名稱/值對外,Set-Cookie http頭還支持各種屬性,這些屬性會影響瀏覽器對Cookie的處理方式。
1、expires,該屬性包含一個時間,告訴瀏覽器它應(yīng)該保存這個Cookie多長時間 ,后期之后,瀏覽器就會刪除這個Cookie。
protected void page_load(object sender,EventArgs e)
{
??? HttpCookie cookie = new HttpCookie("name");
??? cookie.Value = "value";
??? cookie.Expires = DateTime.Now.AddYears(1);
??? this.Response.AppendCookie(cookie);
}
在js中:
function SetCookie(name,value,minutes){
??? var exp = new Date(new Date().GetTime()+minutes*60000);
??? document.Cookie = name + '=' + escape(value) +';expires='+exp.ToGmtString();
}
要刪除Cookie,只要設(shè)置對應(yīng)Cookie的expires屬性即可,設(shè)為過去的時間。
2、path該屬性是區(qū)分大小寫的字符串,為了讓瀏覽器能將Cookie發(fā)送給服務(wù)器,path屬性必須以url的domain路徑開始,path不僅僅可以設(shè)置為文件夾名稱。設(shè)置path的url必須指
定的path屬性字符串開始,以便匹配該屬性。
舉例:Http://www.cnblogs.com/ch03/page.aspx有效的path設(shè)置包括:
/ 、/ch 、/ch03 、/ch03/ 以及 /ch03/page
如果你的目的是將path指定為文件夾名,那么path應(yīng)該以斜線結(jié)尾。
瀏覽器為相同的域名保存多個名稱相同的path不同的Cookie,因此有可能會接受到多個相同名稱的Cookie,要消除歧義并不容易,因此Cookie屬性,比如path不會在Cookie中返回
服務(wù)器中。
默認(rèn)的path是/,意思是改域名下的所有的url,瀏覽器都會發(fā)送Cookie給服務(wù)器。
要設(shè)置path屬性,確保path限制作用:
protected void page_load(object sender,EventArgs e)
{
??? HttpCookie cookie = new HttpCookie("name");
??? cookie.Value = "value";
??? cookie.Path = "/ch03/";
??? this.Response.AppendCookie(cookie);
}
在js中:
function SetCookie(name,value,path){
??? document.Cookie = name + '=' + escape(value) +';path='+path;
}
3、domain該屬性告訴瀏覽器哪一個域名與Cookie相關(guān)聯(lián),如果需要設(shè)置Cookie讓其對多個子域名可見,那就可以使用這個屬性。
對請求的url使用EndsWith()匹配比較domain屬性值,相匹配則Cookie可見:
protected void page_load(object sender,EventArgs e)
{
??? HttpCookie cookie = new HttpCookie("name");
??? cookie.Value = "value";
??? cookie.Domain = ".cnblogs.com";
??? this.Response.AppendCookie(cookie);
}
在js中:
function SetCookie(name,value,dom){
??? document.Cookie = name + '=' + escape(value) +';domain='+dom;
}
4、HttpOnly改屬性告訴瀏覽器該Cookie對Javascript不可見
protected void page_load(object sender,EventArgs e)
{
??? HttpCookie cookie = new HttpCookie("name");
??? cookie.Value = "value";
??? cookie.HttpOnly = true;
??? this.Response.AppendCookie(cookie);
}
5、secure該屬性只會是https頁面會發(fā)生給瀏覽器,不然不可見:
protected void page_load(object sender,EventArgs e)
{
??? HttpCookie cookie = new HttpCookie("name");
??? cookie.Value = "value";
??? cookie.Secure = true;
??? this.Response.AppendCookie(cookie);
}
在js中:
function SetCookie(name,value,dom){
??? document.Cookie = name + '=' + escape(value) +';secure';
}
6、讀取Cookie
protected void page_load(object sender,EventArgs e)
{
??? HttpCookie cookie = this.Request.Cookie["name"];
??? if(cookie!=null)
??? {
??????? string value = cookie.Value;
??? }
}
在js中:
function GetCookie(name){
??? var allcookies = document.Cookie;
??? var start= allcookies.indexof(name+'=');
??? if(start == -1)
??? {
?????? return null;
??? }
??? start += name.length+1;
??? var end = allcookies.indexof(';',start);
??? if(end == -1)
??? {
??????? end = allcookies.length;
??? }
??? var cookieval = allcookies.substring(start,end);
??? return unescape(cookieval);
}
總結(jié)
以上是生活随笔為你收集整理的Cookie的小知识的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Windows 2008在域中不能更改密
- 下一篇: 【转】(原創) 如何使用ModelSim