何為跨域跨域session/cookie?
也就是第三方session/cookie。第一方session/cookie指的是訪(fǎng)客當(dāng)前訪(fǎng)問(wèn)的網(wǎng)站給訪(fǎng)客的瀏覽器設(shè)置的seesion /cookie, 會(huì)被存儲(chǔ)在訪(fǎng)客的計(jì)算機(jī)上。第三方session/cookie指的是當(dāng)前訪(fǎng)問(wèn)的網(wǎng)站中會(huì)加載(嵌入)另外第三方的網(wǎng)站代碼,例如促銷(xiāo)廣告,那么第三方網(wǎng) 站也會(huì)在訪(fǎng)客的計(jì)算機(jī)上添加session/cookie,這種就是第三方session/cookie。
我的問(wèn)題
在開(kāi)發(fā)訊息在線(xiàn)產(chǎn)品(http://iap.pgia.net)測(cè)試各種瀏覽器的兼容性時(shí),發(fā)現(xiàn)IE瀏覽器(v7\8)都無(wú)法登錄(總是提示驗(yàn)證碼不匹配錯(cuò)誤),而其它瀏覽器無(wú)此問(wèn)題(firefox、百度等)。因此可以斷定這和瀏覽器脫不了干系。
初步分析:
細(xì)查發(fā)現(xiàn),在使用IE瀏覽器(v7\8)訪(fǎng)問(wèn)時(shí),服務(wù)器端日志中顯示sessionId一直在變化,每次請(qǐng)求都會(huì)產(chǎn)生一個(gè)全新的sessionId.
顯然這是導(dǎo)致無(wú)法登錄的直接唯一原因,如果解決這個(gè)問(wèn)題則可正常登錄。
深入分析:
為什么在IE瀏覽器(v7\8)上會(huì)出現(xiàn)這種情況呢,百度了解后得知:
出于隱私安全的考慮,IE會(huì)丟失Iframe中的Cookie,IE6/IE7支持的P3P(Platform for Privacy Preferences Project (P3P) specification)協(xié)議默認(rèn)阻止第三方無(wú)隱私安全聲明的cookie,F(xiàn)irefox、Chrome 不存在此問(wèn)題。
我們知道Session 其實(shí)就是基于Cookie的??蛻?hù)端在第一次與服務(wù)器建立會(huì)話(huà)時(shí),會(huì)分配給客戶(hù)端一個(gè)隨機(jī)的sessionId,并存于客戶(hù)端cookie中,然后在之后的請(qǐng)求中,會(huì)帶上這個(gè)Cookie,如果在客戶(hù)端找不到這樣的Cookie,那么服務(wù)器就會(huì)重新分配一個(gè)。
而我的應(yīng)用結(jié)構(gòu)恰恰如此,即內(nèi)置一個(gè)iframe嵌入遠(yuǎn)程應(yīng)用來(lái)實(shí)現(xiàn)的。
解決辦法:
要解決這個(gè)問(wèn)題就是要在請(qǐng)求時(shí)添加“P3P”協(xié)議。那么如何實(shí)現(xiàn)呢?
在框架頁(yè)面加入如下代碼:
復(fù)制代碼 代碼如下:
%
// 解決IE7\8跨域訪(fǎng)問(wèn)問(wèn)題
response.setHeader("P3P","CP=\"IDC DSP COR ADM DEVi TAIi PSA PSD IVAi IVDi CONi HIS OUR IND CNT\"");
%>
至此,問(wèn)題已解決
您可能感興趣的文章:- 異步 HttpContext.Current實(shí)現(xiàn)取值的方法(解決異步Application,Session,Cache...等失效的問(wèn)題)
- 瀏覽器關(guān)閉使session失效的問(wèn)題多種解決方式
- Laravel 5框架學(xué)習(xí)之Eloquent (laravel 的ORM)
- Laravel 5框架學(xué)習(xí)之表單
- Laravel 5框架學(xué)習(xí)之日期,Mutator 和 Scope
- Laravel 5框架學(xué)習(xí)之表單驗(yàn)證
- Laravel 5 框架入門(mén)(一)
- 關(guān)于擴(kuò)展 Laravel 默認(rèn) Session 中間件導(dǎo)致的 Session 寫(xiě)入失效問(wèn)題分析
- Session對(duì)象失效的客戶(hù)端解決方法