需求:在某頁(yè)面add的cookie在另一個(gè)頁(yè)面卻獲取不到。
——難道cookie只對(duì)當(dāng)前頁(yè)面有效距境?學(xué)習(xí)后發(fā)現(xiàn),cookie除了有name师幕、value和生存時(shí)長(zhǎng)等這些屬性之外伪货,還有很多很重要的屬性,而domain屬性將指定可訪問此cookie的域名蒙挑,path屬性將指定該cookie的頁(yè)面路徑忆蚀。
一姑裂、Cookie的屬性
一個(gè)域名下面可能存在著很多個(gè)cookie對(duì)象舶斧,cookie具有多個(gè)屬性:
name字段為一個(gè)cookie的名稱
value字段為一個(gè)cookie的值
domain字段為可以訪問此cookie的域名,Servlet中通過setDomain()設(shè)置
非頂級(jí)域名泽台,如二級(jí)域名或者三級(jí)域名矾缓,設(shè)置的cookie的domain只能為頂級(jí)域名或者二級(jí)域名或者三級(jí)域名本身嗜闻,不能設(shè)置其他二級(jí)域名的cookie蜕依,否則cookie無法生成。
頂級(jí)域名只能設(shè)置domain為頂級(jí)域名琉雳,不能設(shè)置為二級(jí)域名或者三級(jí)域名样眠,否則cookie無法生成。
二級(jí)域名能讀取設(shè)置了domain為頂級(jí)域名或者自身的cookie翠肘,不能讀取其他二級(jí)域名domain的cookie吹缔。所以要想cookie在多個(gè)二級(jí)域名中共享,需要設(shè)置domain為頂級(jí)域名锯茄,這樣就可以在所有二級(jí)域名里面或者到這個(gè)cookie的值了。
頂級(jí)域名只能獲取到domain設(shè)置為頂級(jí)域名的cookie,其他domain設(shè)置為二級(jí)域名的無法獲取肌幽。
path字段為可以訪問此cookie的頁(yè)面路徑晚碾。 比如domain是abc.com,path是/test喂急,那么只有/test路徑下的頁(yè)面可以讀取此cookie格嘁。Servlet中通過setPath()設(shè)置,"/"表示根路徑
expires/Max-Age 字段為此cookie超時(shí)時(shí)間廊移。若設(shè)置其值為一個(gè)時(shí)間吸申,那么當(dāng)?shù)竭_(dá)此時(shí)間后剪撬,此cookie失效。不設(shè)置的話默認(rèn)值是Session,意思是cookie會(huì)和session一起失效丙躏。當(dāng)瀏覽器關(guān)閉(不是瀏覽器標(biāo)簽頁(yè),而是整個(gè)瀏覽器) 后止毕,此cookie失效套才。
size字段 此cookie大小。
http字段 cookie的http only屬性辱揭。若此屬性為true离唐,則只有在http請(qǐng)求頭中會(huì)帶有此cookie的信息,而不能通過document.cookie來訪問此cookie问窃。
secure 字段 設(shè)置是否只能通過https來傳遞此條cookie
二亥鬓、Cookie的路徑
我們知道Cookie的屬性有很多,其中有一個(gè)屬性是路徑域庇。有些人認(rèn)為Cookie的路徑指的是Cookie在客戶端的保存路徑嵌戈,其實(shí)并不是。Cookie的路徑是在服務(wù)器創(chuàng)建Cookie時(shí)設(shè)置的较剃,它的作用是決定瀏覽器訪問服務(wù)器的某個(gè)資源時(shí)咕别,需要將瀏覽器端保存的那些Cookie歸還給服務(wù)器。
三写穴、Cookie跨域setDomain和setPath
正常的cookie只能在一個(gè)應(yīng)用中共享惰拱,即一個(gè)cookie只能由創(chuàng)建它的應(yīng)用獲得。
1.可在同一應(yīng)用服務(wù)器內(nèi)共享方法:
設(shè)置cookie.setPath("/"); 假設(shè)本機(jī)tomcat/webapp下面有兩個(gè)應(yīng)用:cas和webapp_b:
1)原來在cas下面設(shè)置的cookie啊送,在webapp_b下面獲取不到偿短,path默認(rèn)是產(chǎn)生cookie的應(yīng)用的路徑。
2)若在cas下面設(shè)置cookie的時(shí)候馋没,增加一條cookie.setPath("/");或者cookie.setPath("/webapp_b/");就可以在webapp_b下面獲取到cas設(shè)置的cookie了昔逗。
3)此處的參數(shù),是相對(duì)于應(yīng)用服務(wù)器存放應(yīng)用的文件夾的根目錄而言的(比如tomcat下面的webapp)篷朵,因此cookie.setPath("/");之后勾怒,可以在webapp文件夾下的所有應(yīng)用共享cookie婆排,而cookie.setPath("/webapp_b/");是指cas應(yīng)用設(shè)置的cookie只能在webapp_b應(yīng)用下的獲得,即便是產(chǎn)生這個(gè)cookie的cas應(yīng)用也不可以笔链。
4)設(shè)置cookie.setPath("/webapp_b/jsp")或者cookie.setPath("/webapp_b/jsp/")的時(shí)候段只,只有在webapp_b/jsp下面可以獲得cookie,在webapp_b下面但是在jsp文件夾外的都不能獲得cookie鉴扫。
5)設(shè)置cookie.setPath("/webapp_b");赞枕,是指在webapp_b下面才可以使用cookie,這樣就不可以在產(chǎn)生cookie的應(yīng)用cas下面獲取cookie了
6)有多條cookie.setPath("XXX");語句的時(shí)候坪创,起作用的以最后一條為準(zhǔn)炕婶。
2.跨域共享cookie的方法:
設(shè)置cookie.setDomain(".jszx.com");假設(shè) A機(jī)所在的域:home.langchao.com,A有應(yīng)用cas B機(jī)所在的域:jszx.com,B有應(yīng)用webapp_b :
1)在cas下面設(shè)置cookie的時(shí)候莱预,增加cookie.setDomain(".jszx.com")柠掂,這樣在webapp_b下面就可以取到cookie。
2)這個(gè)參數(shù)必須以“.”開始锁施。
3)輸入url訪問webapp_b的時(shí)候陪踩,必須輸入域名才能解析。比如說在A機(jī)器輸入:http://lc-bsp.jszx.com:8080/webapp_b,可以獲取cas在客戶端設(shè)置的cookie悉抵,而B機(jī)器訪問本機(jī)的應(yīng)用肩狂,輸入:http://localhost:8080/webapp_b則不可以獲得cookie。
4)設(shè)置了cookie.setDomain(".jszx.com");姥饰,還可以在默認(rèn)的home.langchao.com下面共享傻谁。