JS跨域設(shè)置和取Cookie
在Javascript腳本里,一個(gè)cookie 實(shí)際就是一個(gè)字符串屬性。當(dāng)你讀取cookie的值時(shí),就得到一個(gè)字符串,里面當(dāng)前WEB頁使用的所有cookies的名稱和值。每個(gè)cookie除了 name名稱和value值這兩個(gè)屬性以外,還有四個(gè)屬性。這些屬性是: expires過期時(shí)間、 path路徑、 domain域、以及 secure安全。
Expires – 過期時(shí)間。指定cookie的生命期。具體是值是過期日期。如果想讓cookie的存在期限超過當(dāng)前瀏覽器會(huì)話時(shí)間,就必須使用這個(gè)屬性。當(dāng)過了到期日期時(shí),瀏覽器就可以刪除cookie文件,沒有任何影響。
Path – 路徑。指定與cookie關(guān)聯(lián)的WEB頁。值可以是一個(gè)目錄,或者是一個(gè)路徑。如果http://www.zdnet.com/devhead /index.html 建立了一個(gè)cookie,那么在http://www.zdnet.com/devhead/目錄里的所有頁面,以及該目錄下面任何子目錄里的頁面都可以 訪問這個(gè)cookie。這就是說,在http://www.zdnet.com/devhead/stories/articles 里的任何頁面都可以訪問http://www.zdnet.com/devhead/index.html建立的cookie。但是,如果http: //www.zdnet.com/zdnn/ 需要訪問http://www.zdnet.com/devhead/index.html設(shè)置的cookes,該怎么辦?這時(shí),我們要把cookies 的path屬性設(shè)置成“/”。
在指定路徑的時(shí)候,凡是來自同一服務(wù)器,URL里有相同路徑的所有WEB頁面都可以共享cookies?,F(xiàn)在看另一個(gè)例子: 如果想讓 http://www.zdnet.com/devhead/filters/ 和http://www.zdnet.com/devhead/stories/共享cookies,就要把path設(shè)成“/devhead”。
Domain – 域。指定關(guān)聯(lián)的WEB服務(wù)器或域。值是域名,比如zdnet.com。這是對path路徑屬性的一個(gè)延伸。如果我們想讓 catalog.mycompany.com 能夠訪問shoppingcart.mycompany.com設(shè)置的cookies,該怎么辦? 我們可以把domain屬性設(shè)置成“mycompany.com”,并把path屬性設(shè)置成“/”。不能把cookies域?qū)傩栽O(shè)置成與設(shè)置它的服務(wù)器的 所在域不同的值。
Secure – 安全。指定cookie的值通過網(wǎng)絡(luò)如何在用戶和WEB服務(wù)器之間傳遞。這個(gè)屬性的值或者是“secure”,或者為空。缺省情況下,該屬性為空,也就是 使用不安全的HTTP連接傳遞數(shù)據(jù)。如果一個(gè) cookie 標(biāo)記為secure,那么,它與WEB服務(wù)器之間就通過HTTPS或者其它安全協(xié)議傳遞數(shù)據(jù)。不過,設(shè)置了secure屬性不代表其他人不能看到你機(jī)器本 地保存的cookie。換句話說,把cookie設(shè)置為secure,只保證cookie與WEB服務(wù)器之間的數(shù)據(jù)傳輸過程加密,而保存在本地的 cookie文件并不加密。如果想讓本地cookie也加密,得自己加密數(shù)據(jù)。
例:a.b.com和c.b.com兩個(gè)站,建立方式如下:
a.b.com站下建a.html。關(guān)鍵代碼如下:
- <script type="text/javascript">
- function setCookie(c_name,value,expiredays) {
- var exdate=new Date();
- exdate.setDate(exdate.getDate()+expiredays);
- alert(exdate.getDate()+expiredays);
- document.cookie=c_name+ "=" +escape(value)+((expiredays==null) ? "" : ";expires="+exdate.toGMTString())+";path=/;domain=b.com";
- }
- window.onload=function(){
- setCookie("listallwjh","sfwjh");
- alert("Cookie設(shè)置成功!");
- }
- </script>
c.b.com站下建a.html。關(guān)鍵代碼如下
- <script>
- function getCookie(c_name) {
- if (document.cookie.length>0)
- {
- c_start=document.cookie.indexOf(c_name + "=");
- if (c_start!=-1)
- {
- c_start=c_start + c_name.length+1 ;
- c_end=document.cookie.indexOf(";",c_start);
- if (c_end==-1) c_end=document.cookie.length;
- return unescape(document.cookie.substring(c_start,c_end));
- }
- }
- return "";
- }
- window.onload=function(){
- var c_name="listallwjh";
- if(getCookie("listallwjh")!=null){
- alert(getCookie("listallwjh"));
- }
- }
- </script>
這兩個(gè)一個(gè)也面是設(shè)置,一個(gè)是取,只要保證兩個(gè)規(guī)則一樣,就行。運(yùn)行,結(jié)果:OK!
注:這兩個(gè)方法有時(shí)候也可以寫在一起,先判斷cookie是否存在,在創(chuàng)建。
友情資料:
一、瀏覽器允許每個(gè)域名所包含的 cookie 數(shù):Microsoft 指出 Internet Explorer 8 增加 cookie 限制為每個(gè)域名 50 個(gè),但 IE7 似乎也允許每個(gè)域名 50 個(gè) cookie( color="#006da3">《Update to Internet Explorer’s Cookie Jar》)。
Firefox 每個(gè)域名 cookie 限制為 50 個(gè)。Opera 每個(gè)域名 cookie 限制為 30 個(gè)。Safari/WebKit 貌似沒有 cookie 限制。但是如果 cookie 很多,則會(huì)使 header 大小超過服務(wù)器的處理的限制,會(huì)導(dǎo)致錯(cuò)誤發(fā)生。注:每個(gè)域名 cookie 限制為 20 個(gè)將不再正確!
二、當(dāng)很多的 cookie 被設(shè)置,瀏覽器如何去響應(yīng)。除 (可以設(shè)置全部cookie,不管數(shù)量多少),有兩個(gè)方法:最少最近使用(least recently used (LRU))的方法:當(dāng) Cookie 已達(dá)到限額,自動(dòng)踢除最老的 Cookie ,以使給最新的 Cookie 一些空間。 Internet Explorer 和 Opera 使用此方法。
Firefox 很獨(dú)特:雖然最后的設(shè)置的 Cookie 始終保留,但似乎隨機(jī)決定哪些 cookie 被保留。似乎沒有任何計(jì)劃(建議:在 Firefox 中不要超過 Cookie 限制)。
三、不同瀏覽器間 cookie 總大小也不同:Firefox 和 Safari 允許 cookie 多達(dá) 4097 個(gè)字節(jié), 包括名(name)、值(value)和等號。Opera 允許 cookie 多達(dá) 4096 個(gè)字節(jié), 包括:名(name)、值(value)和等號。Internet Explorer 允許 cookie 多達(dá) 4095 個(gè)字節(jié), 包括:名(name)、值(value)和等號。注:多字節(jié)字符計(jì)算為兩個(gè)字節(jié)。在所有瀏覽器中,任何 cookie 大小超過限制都被忽略,且永遠(yuǎn)不會(huì)被設(shè)置。
當(dāng)訪問者首次訪問頁面時(shí),他或她也許會(huì)填寫他/她們的名字。名字會(huì)存儲(chǔ)于 cookie 中。當(dāng)訪問者再次訪問網(wǎng)站時(shí),他們會(huì)收到類似 "Welcome John Doe!" 的歡迎詞。而名字則是從 cookie 中取回的。這就是Cookie,希望本文能幫助到你。
【編輯推薦】