asp.net 驗證碼session為null的解決方案
最近在做Y集團的訂單系統時,登陸頁面在測試時發現一個以前沒有注意到的問題,登陸頁面需要使用驗證碼,引用了一個生成驗證碼的aspx頁面,在aspx頁面中生成session和驗證碼圖片,在登陸頁面的后臺處理中使用這個session來判斷驗證碼的正確與否。奇怪的是第一次登陸是沒有問題的,可當登陸成功后,在session的有效期間內關閉瀏覽器,然后重啟瀏覽器進入登陸頁面重新登陸,登陸頁面的后臺卻獲取不到session了,刷新驗證碼的頁面也不能使得session被登陸頁面獲取,后來我嘗試把瀏覽器的cookie刪除后再是,結果可以登陸了。這樣原因就找到了,cookie。突然想到session的工作機制,在生成session的時候會向瀏覽器客戶端發送一個會話id,作為cookie保存在瀏覽器,這樣回傳是服務器可以判斷與哪一個用戶會話相對應,突然關閉瀏覽器再重新打開,會話id并沒有發生改變,通過測試發現管理瀏覽器重新打開服務端session會丟失,那么驗證碼頁面重新生成session后卻無法重新獲取的原因可能是,新的session實例的會話id并沒有更新回客戶端,客戶端返回的仍然是之前的會話id(在有效期內),這樣服務器端在對應的時候找不到之前的服務器session會話了,雖然有一份新的服務端session,但是與這個已經對應不上了,這樣就產生了第二次怎么樣也登陸不上去的問題,解決的方法就是在登陸頁面,登陸事件里做如下操作
if (Session["ValidCode"] == null)
{
Response.Redirect("Account/logoff.aspx");
return;
}
logoff.aspx頁面是一個注銷頁面,最后悔跳轉回登陸頁面,
他的load事件代碼如下
HttpCookie aCookie;
string cookieName;
int limit = Request.Cookies.Count;
for (int i = 0; i < limit; i++)
{
cookieName = Request.Cookies[i].Name;
aCookie = new HttpCookie(cookieName);
aCookie.Expires = DateTime.Now.AddDays(-1);
Response.Cookies.Add(aCookie);
}
Response.BufferOutput = true;
Response.Cache.SetExpires(DateTime.Now.AddMilliseconds(-1));
Response.Cache.SetCacheability(HttpCacheability.NoCache);
Response.AppendHeader("Pragma", "No-Cache");
Response.Buffer = true;
Response.ExpiresAbsolute = DateTime.Now.AddDays(-1);
Response.Cache.SetExpires(DateTime.Now.AddDays(-1));
Response.Expires = 0;
Response.CacheControl = "no-cache";
Response.Cache.SetNoStore();
FormsAuthentication.SignOut();
Response.Redirect("../default.aspx");
據msdn文檔的意思說,Response.Redirect()在這里的作用很重要,可以重新建立起會話;可能沒必要這么麻煩,可能只需一次Response.Redirect()重載自己就夠了,這個我沒有實驗。
實測有效。記錄一下以備后查。

浙公網安備 33010602011771號