希望對那些正好遇到此問題的人有點協助。下面是asp.net的原始碼,可以下載.
window.open開啟視窗Session丟失
window.open雖然很不討人喜歡,但它有時候又有一定的用處,現在很多辦公自動化系統(OA),
為了給使用者更大的操作空間,都在使用者登陸以後用window.open開啟一個只有標題列的視窗。
但是在open出來的視窗中,卻找不到在登陸視窗產生的session了。
一:在asp.net中的解決辦法:
1:假若登入視窗為default.aspx,我們在後台可以這樣寫:
1 string user = Request.Form["user"];
2 Session["_uid"] = user;
3 string sid = Session.SessionID;
4 Page.RegisterStartupScript
5 ("open","<script>
6 window.open
7 ('index.aspx?sid="+sid+"','_blank','status=yes,scrollbars=yes,resizable=yes');
8 </script>");
9
這樣我們就可以把SessionID傳遞到新開啟的視窗index.aspx中,我們在index.aspx中就可以根據這個SessionID
重新構造一個Session。
2:在index.aspx中我們可以這樣來重新構造session:
1 using System.Web.SessionState;
2
3 public partial class index : System.Web.UI.Page
4 {
5 protected void Page_Load(object sender, EventArgs e)
6 {
7 string sid = Request.QueryString["sid"].ToString();
8 SessionIDTest ss = new SessionIDTest(sid);
9 ss.CreateSessionID(Context);
10 }
11 }
12
13 public class SessionIDTest : SessionIDManager
14 {
15 private string sid;
16 public SessionIDTest(string sid)
17 {
18 this.sid = sid;
19 }
20 public override string CreateSessionID(HttpContext context)
21 {
22 return sid;
23 }
24
25 }
其中我們用到了SessionState命名空間下的SessionIDManager類,我們通過重寫它的CreateSessionID
這個虛方法來重新或得Session。CreateSessionID這個虛方法需要我們重寫,它返回的就是一個新的Session
的SessionID,而這個SessionID就是從登陸介面default.aspx中傳遞過來的,所以我們可以認為新構造的
Session和登陸視窗的Session是一個Session。
二:在php中的解決辦法:
1:在php中解決這個sesssion丟失,用的也是同樣的辦法,並且還更簡單,只需兩個函數就搞定了,
session_start();
$sid=session_id();
session_id這個函數就是取得登陸介面的SessionID。
2:然後我們就可以想在.net中一樣,根據這個SessionID構造一個Session:
$sid=$_GET['sid'];
session_id($sid);
session_start();
Session_id這個函數就是重新構造Session。