小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

跨域訪問時(shí)Session丟失

 franklinfj 2010-11-13
發(fā)表時(shí)間:2008-11-07   最后修改:2008-11-07

我目前在做一個(gè)電子購(gòu)物網(wǎng)站。這個(gè)網(wǎng)站對(duì)應(yīng)著不同的國(guó)家,將會(huì)有不同的域名。比如,對(duì)英國(guó)會(huì)是www..uk,對(duì)中國(guó)可能是www..cn。但是,在涉及到支付時(shí),都會(huì)轉(zhuǎn)向一個(gè)地址:https://checkout.。這些不同的域名,實(shí)際上是指向同一臺(tái)服務(wù)器的同一個(gè)Server。 

在實(shí)際使用中,由于域名不同,但又需要跨域訪問。主要應(yīng)用場(chǎng)景是,客戶在英國(guó)的購(gòu)物網(wǎng)站-http://www..uk(簡(jiǎn)稱:uk站) 中往購(gòu)物車中放置了商品,最后,轉(zhuǎn)至https://l來進(jìn)行支付工作。這時(shí)就碰到了跨域訪問時(shí),Session丟失的問題。 

先說一下,我們用的服務(wù)器是Tomcat。Tomcat是通過url中的jsessionid以及cookie中的jsessionid來取得會(huì)話ID的。Tomcat先會(huì)查詢URL后面有沒有跟jsessionid。然后,再去解析Cookie中的jsessionid。如果cookie中有的話,那么,不管之前從URL中有沒有找會(huì)jsessionid,都會(huì)使用cookie中找到的。詳情參見Tomcat中的CoyoteAdapter類。 


問題1:我打開瀏覽器,在uk站中買了一件商品,當(dāng)我點(diǎn)擊頁面中的Check Out鏈接時(shí),頁面跳入了https://checkout.的支付頁面后,用戶購(gòu)物車?yán)锏纳唐吩谔D(zhuǎn)在支付頁面中消失了。 

問題原因:由于兩者的域名不同,在跳轉(zhuǎn)到支付頁面時(shí),丟失了原來的會(huì)話信息。無論是URL還是cookie中都找不到會(huì)話ID了。Tomcat創(chuàng)建了一個(gè)空空如也的新會(huì)話。 

解決辦法:重寫鏈接,在支付鏈接后加上jsessionid,也就是像這樣https://checkout.;jsessionid=A8AB5D19484BFCF26E8E4F708E2F6C91.jvm1。在轉(zhuǎn)到支付頁面時(shí),由于此時(shí)瀏覽器中https://checkout.域名的cookie中沒有任何信息,則Tomcat會(huì)使用URL中取得的sessionId。這樣,就能繼續(xù)使用uk站中的會(huì)話了。 


問題2:通過URL重寫,我們可以在https://checkout.的頁面能夠看到購(gòu)物網(wǎng)站的信息了,我本以為一切到此結(jié)束了,沒想到,又出現(xiàn)了新的問題。在支付過程中,頁面使用Ajax和服務(wù)器做些數(shù)據(jù)的交互??擅看谓粨Q,服務(wù)器居然都報(bào)session中找不到用戶登錄信息的exception。仔細(xì)看了下日志,服務(wù)器在處理支付頁面上的初次的Ajax請(qǐng)求時(shí),居然創(chuàng)建了一個(gè)新的Session。 

問題原因:在通過Ajax發(fā)送請(qǐng)求時(shí),Tomcat無法從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,而沒有創(chuàng)建新的session,便沒有向?yàn)g覽器的cookie寫入信息JSESSIONID的信息了(這是我猜測(cè)的,沒看代碼證實(shí)過)。 

解決辦法:既然能在轉(zhuǎn)入支付頁面時(shí)使用原有的Session,那么,就在剛轉(zhuǎn)入支付頁面時(shí),把sessionid寫入cookie不就行了嗎?這里我暫時(shí)用js把sessionid寫入了cookie中。之后做了幾次測(cè)試都順利地通過了。 


問題3:好了,當(dāng)我以為一切都OK的時(shí)候,又出現(xiàn)了一個(gè)問題。我先打開www.,也就是checkout.的主域名。接著再打開www..uk進(jìn)行購(gòu)買的操作。此時(shí),當(dāng)我轉(zhuǎn)入https://checkout.時(shí),session又丟失了。 

問題原因:其實(shí),這里的session沒有丟失。通過SessionID來看,在轉(zhuǎn)入https://checkout.時(shí),由于之前打開了其主域名www.,在cookie中留下了host為xxx的session的信息。而在從購(gòu)物網(wǎng)站轉(zhuǎn)入支付頁面時(shí),Tomcat先從URL中取得了uk站的會(huì)話ID,但是最后又從cookie中取到了www.的會(huì)話ID,并且使用了它。 

解決辦法:暫無。 

候選辦法1:修改Tomcat中的CoyoteAdapter類,讓它以URL中的jsessionid為主,以cookie中的為輔。但是,這樣做就會(huì)有個(gè)很大的問題。那就是,如果用戶收藏了一個(gè)購(gòu)物站中的一商品的鏈接。而這個(gè)鏈接后面又跟了一個(gè)已經(jīng)失效的jsessionid,那么,服務(wù)器端會(huì)由于拿不到這個(gè)失效的jsessionid對(duì)應(yīng)的Session,而去創(chuàng)建一個(gè)新的會(huì)話。這樣子,就很有可能在同一個(gè)瀏覽器中訪問相同的站點(diǎn),但卻面對(duì)著不同的會(huì)話。 

候選辦法2:讓公司再單獨(dú)開個(gè)域名,專門負(fù)責(zé)處理check out。在進(jìn)入這個(gè)域名前,對(duì)header中的referer信息進(jìn)行驗(yàn)證,如果來自購(gòu)物網(wǎng)站,則對(duì)請(qǐng)求進(jìn)行正常處理。反之,則重定向到其它的域名。不知道重寫向時(shí),會(huì)不會(huì)向cookie中寫入信息?這個(gè)不知道可行否。 

不知道各位對(duì)應(yīng)問題3的情況有什么處理建議嗎?還望大家不吝賜一二呀。 

PS. 據(jù)說,SSL證書是針對(duì)域名收錢的。所以,我們針對(duì)不同國(guó)家或有不同的域名。但對(duì)于支付,都是跳轉(zhuǎn)到https://checkout.這一個(gè)來進(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的問題了。 而是兩個(gè)不同的應(yīng)用間,共享數(shù)據(jù)的問題了。 

兜了圈子,猛然發(fā)現(xiàn),現(xiàn)在我在努力解決的問題,不是將來要實(shí)際面對(duì)的問題??窈?。 

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多