前幾天因為一企業網站,內有一客戶的服務系統,那個網站因為是租用的空間,不足以存放客戶系統,所以另外搞了個伺服器,為了使域名的統一性(另一個伺服器的域名與原網域差異過大),所以把這個客戶系統用框架包含在了原來的網站內,但碰到了因為跨域操作而使客戶系統用戶登陸後發生session丟失的問題,困撓了一整天,也在此發帖徵求解決方法,見:http://bbs.bc-cn.net/dispbbs.asp ?boardID=10&ID=167628&page=3。後經本人多方查找資料,經過本人分析和試驗,終於把這個問題給解決了,今天見有人問要程序,所以寫這個貼子,以供大家共享。
首先說明原理:
系統是認一個一個程序範圍的,一般來說,一個IE預設為一個程序範圍.
框架因為有了跨域的內容,所以它首先默認的是框架程序本身的程序範圍,這樣使得框架內的程序範圍得不到確認.
為了讓這個IE預設為框架內的程序範圍,所以我使用了多次跳轉.
首先,跳出本框架,進入一個無框架的需要session值的網站頁面(就叫它B伺服器的頁面),並在這個頁面中產生一個session以便系統自動產生一個sessionID,然後又跳回有框架的頁.因為系統已經為這個IE產生了一個sessionID,所以只要不關掉這個IE,系統一直以為這個IE是本程式範圍的.這樣,再次產生的session值就得以在這個ID中生存下來.
也就達到了騙過系統的目的.
再補充一點,二次跳轉使用了不同的方式,原因是我需要把框架外的信息丟棄,而要保存框架內的信息.
而不同的跳轉方式會丟棄或保存跳轉前的資訊的。
程式實現方式:
文件1:
框架檔案:index.htm(運作在伺服器A上)
<html>
<head>
<meta HTTP-EQUIV=Content-Type CONTENT=text/html; charset=gb2312>
<title>奇豪門業</title>
</head>
<frameset rows=1,* border=0 frameborder=0>
<frame name=winBackLoad scrolling=no noresize target=mainweb1 src=default_top.htm>
<frame name=mainweb1 src=http://www.serverB.com/index.asp scrolling=auto>
<noframes>
<body>
<p>此網頁使用了框架,但您的瀏覽器不支援框架。 </p>
</body>
</noframes>
</frameset>
</html>
檔案2:index.asp (運行在伺服器B上,作用跳轉和產生sessionID)
<script>
if (top.location !== self.location) {
top.location=self.location;
}
//這個JS的目的是跳出框架運行
</script>
<%
if session(xm2)= then
session(xm2)=eee
'上面這一句的目的只是為了使用session,讓系統為這個IE產生一個sessionID,並且判斷一下是不是已經跳轉過,免得引起死循環。
%>
<META HTTP-EQUIV=REFRESH CONTENT=0;URL='http://www.serverA.com/index.htm'>
<%
,上面這一句是回到框架,注意:只能用上面這個跳轉的方法,別用下面的跳轉方法。
else
Response.Redirect index2.asp
'上面一句才是真正跳轉運行伺服器B上的程式!注意:也只能用這方法跳!
end if%>
經過以上的跳轉,本IE已經有了伺服器B上的sessionID,也就是說,框架雖然是在伺服器A上的主框架運行,但它可以確保伺服器B上的session不會遺失,達到跨域運行的目的。