ASP.NET Response.Redirect 丟失 Session的問題(作廢,僅供參考)


以前在做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測試發現本文所述的問題已經不存在了,Cookie在Response.Redirect后已經可以成功發送到客戶端瀏覽器,並被Redirect之后的服務器頁面讀取到。看到一篇老外寫的文章也提到ASP.NET的一個BUG修復補丁修復了Redirect會丟失Cookie的問題,所以本文所述內容在最新版本的ASP.NET中已不存在,如果在老版本的ASP.NET中遇到本文所述的問題,可以參考上面內容。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM