標籤:style blog io color 使用 java sp strong div
以前在做ASP.NET開發時一直沒注意到一個問題,就是廣泛使用的Response.Redirect方法並不會將伺服器端在Response中新增或修改的Cookie返回給用戶端瀏覽器,而網站的Session一般來說又是通過Cookie來做用戶端唯一標識的,這就會使得當瀏覽器第一次通過Get方法發送請求到伺服器後(由於是用戶端瀏覽器第一次訪問伺服器,所以這時用戶端瀏覽器中還沒有Cookie儲存SessionID),在伺服器返回的響應中得不到帶有SessionID的Cookie,使得瀏覽器在下一次發送請求給伺服器端時,在請求中還是讀不到帶有SessionID的Cookie,伺服器端又會再建立一個新的Session,導致第一次請求在伺服器上建立的Session丟失。注意導致這個問題的前提條件:瀏覽器第一次發送請求到伺服器端,伺服器端使用了Response.Redirect方法,使得產生的帶有SessionID的Cookie不會發送回用戶端瀏覽器。
範例程式碼,瀏覽器發送第一次請求到xxx.aspx中設定Session值,然後跳轉到頁面yyy.aspx後,yyy.aspx中讀不到xxx.aspx中設定的Session值,並且在Request.Cookies中產生了一個和xxx.aspx不同的SessionID.
Session["xxx"] = xxx;Response.Redirect("yyy.aspx");
這就是因為xxx.aspx中的Response.Redirect沒有將產生的SessionID通過Cookie傳回瀏覽器,使得瀏覽器在發送請求到yyy.aspx時,伺服器端檢測不到帶SessionID的Cookie,產生了新的Session啟動了新會話,那麼自然也就得不到在xxx.aspx中設定的Session值了。
解決方案:
在瀏覽器還沒有得到伺服器端產生的SessionID前,伺服器端盡量不要使用Response.Redirect方法做跳轉,而是用替代方案做用戶端URL地址跳轉,比如通過Javascript來設定瀏覽器的window.location屬性。這樣當瀏覽器獲得第一個請求的伺服器端響應時,就能得到帶SessionID的Cookie了,從而在後續請求中將這個帶SessionID的Cookie發送回伺服器端,使會話延續。
ASP.NET Response.Redirect 丟失 Session的問題