本想介紹jsonp的jquery寫(xiě)法和sso單點(diǎn)登陸的相關(guān)內(nèi)容副硅,但是在這之前,我覺(jué)得有必要看一個(gè)問(wèn)題翅萤。
我們知道,使用php生成cookie并發(fā)送給客戶(hù)端很簡(jiǎn)單恐疲,代碼如下:
如上,我們便可以向客戶(hù)端發(fā)送后端生成的cookie套么。
那么接下來(lái)我們來(lái)看一個(gè)現(xiàn)象:
(1)http://a.com/a.php下面的代碼如下:
(2)http://b.com/b.php下面的代碼如下:
(3)http://b.com/index.php下面的代碼如下:
(4)先訪(fǎng)問(wèn)http://a.com/a.php培己,頁(yè)面輸出111,然后訪(fǎng)問(wèn)http://b.com/index.php,我們看到cookie沒(méi)有被設(shè)置成功胚泌,如圖:
接下來(lái)省咨,
(1)我們更改下http://a.com/a.php文件,代碼如下:
(2)http://b.com/b.php下面的代碼不變玷室,如下:
(3)http://b.com/index.php下面的代碼也不變零蓉,如下:
(4)先訪(fǎng)問(wèn)http://a.com/a.php,然后訪(fǎng)問(wèn)http://b.com/index.php穷缤,我們看到cookie被設(shè)置成功:
如圖敌蜂,我們可以看到cookie被設(shè)置成功了,那么為什么上一種情況不能成功設(shè)置cookie津肛,下一中情況就成功設(shè)置cookie了呢章喉?
有人會(huì)說(shuō):這很簡(jiǎn)單,你curl請(qǐng)求是服務(wù)器a請(qǐng)求服務(wù)器b,壓根沒(méi)有瀏覽器參與囊陡,所以服務(wù)器b不知道給哪個(gè)瀏覽器發(fā)送cookie芳绩。
但答案真的是這樣嗎?
其實(shí)撞反,
正常情況下,a請(qǐng)求b妥色,b返回結(jié)果給a,整個(gè)過(guò)程就結(jié)束了遏片。
而上圖中src的方式能成功設(shè)置cookie的原因:瀏覽器通過(guò)a.com上面的src地址訪(fǎng)問(wèn)b.com上面的index.php文件嘹害,b.com上的index.php返回cookie內(nèi)容給瀏覽器,瀏覽器將接收到的cookie寫(xiě)到你本地的計(jì)算機(jī)目錄里面去吮便,整個(gè)過(guò)程就結(jié)束了笔呀。
那curl為什么不能成功設(shè)置cookie呢?瀏覽器通過(guò)a.com/index.php去curl訪(fǎng)問(wèn)b.com/index.php,確實(shí)是a服務(wù)器向b服務(wù)器發(fā)起了請(qǐng)求髓需,但是此時(shí)b服務(wù)器生成了一個(gè)cookie返回給了a服務(wù)器许师,并且a服務(wù)器得到了b服務(wù)器的cookie,但是a服務(wù)器并沒(méi)有把從b服務(wù)器得來(lái)的cookie發(fā)送給瀏覽器僚匆,所以微渠,瀏覽器就沒(méi)有沒(méi)法存儲(chǔ)b.com域下的cookie文件,要注意一點(diǎn)咧擂,a服務(wù)器其實(shí)拿到了b服務(wù)器生成的cookie文件逞盆,而瀏覽器沒(méi)有拿到。
為了證明a服務(wù)器拿到了b服務(wù)器生成的cookie文件松申,我們用代碼測(cè)試一下:
(1)http://a.com/a.php下面的代碼如下:
#上圖中云芦,我們將接收到的cookie寫(xiě)入到了一個(gè)cookie.txt文件中,以用來(lái)檢驗(yàn)里面是否有值
(2)http://b.com/b.php下面的代碼如下:
(3)訪(fǎng)問(wèn)http://a.com/a.php后贸桶,我們看到a.php的當(dāng)前目錄下真的多出了一個(gè)cookie.txt文件舅逸,打開(kāi)文件,我們看到內(nèi)容如下:
cookie文件里面的內(nèi)容刨啸,那不正是我們b.com服務(wù)器生成的cookie嗎?
由此堡赔,可以看出,a.com服務(wù)器確實(shí)接收到了b.com生成的cookie设联。
所以善已,今天的這個(gè)問(wèn)題,其實(shí)就是a服務(wù)器拿到了b服務(wù)器的cookie沒(méi)有給瀏覽器离例,原因就是這樣换团。