發(fā)表時(shí)間:2008-11-07 最后修改:2008-11-07 在實(shí)際使用中,,由于域名不同,,但又需要跨域訪問(wèn)。主要應(yīng)用場(chǎng)景是,,客戶在英國(guó)的購(gòu)物網(wǎng)站-http://www..uk(簡(jiǎn)稱:uk站) 中往購(gòu)物車中放置了商品,,最后,轉(zhuǎn)至https://l來(lái)進(jìn)行支付工作,。這時(shí)就碰到了跨域訪問(wèn)時(shí),,Session丟失的問(wèn)題。 先說(shuō)一下,,我們用的服務(wù)器是Tomcat,。Tomcat是通過(guò)url中的jsessionid以及cookie中的jsessionid來(lái)取得會(huì)話ID的。Tomcat先會(huì)查詢URL后面有沒(méi)有跟jsessionid,。然后,,再去解析Cookie中的jsessionid。如果cookie中有的話,,那么,,不管之前從URL中有沒(méi)有找會(huì)jsessionid,都會(huì)使用cookie中找到的,。詳情參見Tomcat中的CoyoteAdapter類,。 問(wèn)題1:我打開瀏覽器,在uk站中買了一件商品,,當(dāng)我點(diǎn)擊頁(yè)面中的Check Out鏈接時(shí),,頁(yè)面跳入了https://checkout.的支付頁(yè)面后,用戶購(gòu)物車?yán)锏纳唐吩谔D(zhuǎn)在支付頁(yè)面中消失了,。 問(wèn)題原因:由于兩者的域名不同,,在跳轉(zhuǎn)到支付頁(yè)面時(shí),丟失了原來(lái)的會(huì)話信息,。無(wú)論是URL還是cookie中都找不到會(huì)話ID了,。Tomcat創(chuàng)建了一個(gè)空空如也的新會(huì)話。 解決辦法:重寫鏈接,,在支付鏈接后加上jsessionid,,也就是像這樣https://checkout.;jsessionid=A8AB5D19484BFCF26E8E4F708E2F6C91.jvm1。在轉(zhuǎn)到支付頁(yè)面時(shí),,由于此時(shí)瀏覽器中https://checkout.域名的cookie中沒(méi)有任何信息,,則Tomcat會(huì)使用URL中取得的sessionId。這樣,,就能繼續(xù)使用uk站中的會(huì)話了,。 問(wèn)題2:通過(guò)URL重寫,我們可以在https://checkout.的頁(yè)面能夠看到購(gòu)物網(wǎng)站的信息了,我本以為一切到此結(jié)束了,,沒(méi)想到,,又出現(xiàn)了新的問(wèn)題。在支付過(guò)程中,,頁(yè)面使用Ajax和服務(wù)器做些數(shù)據(jù)的交互,。可每次交換,,服務(wù)器居然都報(bào)session中找不到用戶登錄信息的exception,。仔細(xì)看了下日志,服務(wù)器在處理支付頁(yè)面上的初次的Ajax請(qǐng)求時(shí),,居然創(chuàng)建了一個(gè)新的Session,。 問(wèn)題原因:在通過(guò)Ajax發(fā)送請(qǐng)求時(shí),Tomcat無(wú)法從URL中取得會(huì)話ID,,之后,,便試著去Cookie中查詢信息??纱藭r(shí),,https://checkout.下的cookie竟然是空空如也的。之前從購(gòu)物網(wǎng)站跳轉(zhuǎn)至https://checkout.時(shí),,Tomcat從URL中取得了原會(huì)話ID。此時(shí),,Tomcat是繼續(xù)使用原有session,,而沒(méi)有創(chuàng)建新的session,便沒(méi)有向?yàn)g覽器的cookie寫入信息JSESSIONID的信息了(這是我猜測(cè)的,,沒(méi)看代碼證實(shí)過(guò)),。 解決辦法:既然能在轉(zhuǎn)入支付頁(yè)面時(shí)使用原有的Session,那么,,就在剛轉(zhuǎn)入支付頁(yè)面時(shí),,把sessionid寫入cookie不就行了嗎?這里我暫時(shí)用js把sessionid寫入了cookie中,。之后做了幾次測(cè)試都順利地通過(guò)了,。 問(wèn)題3:好了,當(dāng)我以為一切都OK的時(shí)候,,又出現(xiàn)了一個(gè)問(wèn)題,。我先打開www.,也就是checkout.的主域名,。接著再打開www..uk進(jìn)行購(gòu)買的操作,。此時(shí),當(dāng)我轉(zhuǎn)入https://checkout.時(shí),session又丟失了,。 問(wèn)題原因:其實(shí),,這里的session沒(méi)有丟失。通過(guò)SessionID來(lái)看,,在轉(zhuǎn)入https://checkout.時(shí),,由于之前打開了其主域名www.,在cookie中留下了host為xxx的session的信息,。而在從購(gòu)物網(wǎng)站轉(zhuǎn)入支付頁(yè)面時(shí),,Tomcat先從URL中取得了uk站的會(huì)話ID,但是最后又從cookie中取到了www.的會(huì)話ID,,并且使用了它,。 解決辦法:暫無(wú)。 候選辦法1:修改Tomcat中的CoyoteAdapter類,,讓它以URL中的jsessionid為主,,以cookie中的為輔。但是,,這樣做就會(huì)有個(gè)很大的問(wèn)題,。那就是,如果用戶收藏了一個(gè)購(gòu)物站中的一商品的鏈接,。而這個(gè)鏈接后面又跟了一個(gè)已經(jīng)失效的jsessionid,,那么,服務(wù)器端會(huì)由于拿不到這個(gè)失效的jsessionid對(duì)應(yīng)的Session,,而去創(chuàng)建一個(gè)新的會(huì)話,。這樣子,就很有可能在同一個(gè)瀏覽器中訪問(wèn)相同的站點(diǎn),,但卻面對(duì)著不同的會(huì)話,。 候選辦法2:讓公司再單獨(dú)開個(gè)域名,專門負(fù)責(zé)處理check out,。在進(jìn)入這個(gè)域名前,,對(duì)header中的referer信息進(jìn)行驗(yàn)證,如果來(lái)自購(gòu)物網(wǎng)站,,則對(duì)請(qǐng)求進(jìn)行正常處理,。反之,則重定向到其它的域名,。不知道重寫向時(shí),,會(huì)不會(huì)向cookie中寫入信息?這個(gè)不知道可行否,。 不知道各位對(duì)應(yīng)問(wèn)題3的情況有什么處理建議嗎,?還望大家不吝賜一二呀,。 PS. 據(jù)說(shuō),SSL證書是針對(duì)域名收錢的,。所以,,我們針對(duì)不同國(guó)家或有不同的域名。但對(duì)于支付,,都是跳轉(zhuǎn)到https://checkout.這一個(gè)來(lái)進(jìn)行的,。這樣,只需要一張SSL證書就行了,。 補(bǔ)充:目前我們都只是在做一個(gè)國(guó)家的站點(diǎn),,checkout測(cè)試也是針對(duì)一個(gè)國(guó)家的。但實(shí)際上,,各個(gè)不同的國(guó)家的站點(diǎn),,其實(shí)是不同的webapp。它們?cè)谥Ц稌r(shí)都會(huì)轉(zhuǎn)向的那個(gè)checkout網(wǎng)站,,也只能是個(gè)獨(dú)立的webapp了,。那么,這就不是單靠個(gè)sessionid就能和各個(gè)國(guó)家的站點(diǎn)共享他們的session的問(wèn)題了,。 而是兩個(gè)不同的應(yīng)用間,,共享數(shù)據(jù)的問(wèn)題了。 兜了圈子,,猛然發(fā)現(xiàn),,現(xiàn)在我在努力解決的問(wèn)題,不是將來(lái)要實(shí)際面對(duì)的問(wèn)題,??窈埂?img doc360img-src='http://image17.360doc.com/DownloadImg/2010/11/1313/6762778_3.gif' src="http://image17.360doc.com/DownloadImg/2010/11/1313/6762778_3.gif"> |
|
來(lái)自: franklinfj > 《C#與網(wǎng)頁(yè)》