谈谈 Cookie 存取和IE页面缓存的问题
生活随笔
收集整理的這篇文章主要介紹了
谈谈 Cookie 存取和IE页面缓存的问题
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
最近老是發現在IE里會有Cookie的問題,如IE下面無法登出,或無法登錄,或者登錄后信息卻無法取到,而Firefox下面一直是通過的,都試過好多次了,今天終于找回的主要的原因;
Cookie的問題:
首先看一下我的Cookie存取代碼 (這個Cookie操作支持二級域名訪問)
#region 存取Cookie
/// 〈summary〉
/// 存Cookie
/// Json Lee 2007-09-24
/// 〈/summary〉
/// 〈param name="strName"〉名稱〈/param〉
/// 〈param name="strValue"〉值〈/param〉
/// 〈param name="expDate"〉到期時間〈/param〉
/// 〈returns〉〈/returns〉
public void SetCookie(string cookieName, string cookieValue, int cookieExpiryMinute)
{
cookieName = cookieName.ToLower();
HttpCookie cookie = new HttpCookie(cookieName,cookieValue);
cookie.Expires = DateTime.Now.AddMinutes(cookieExpiryMinute); //設置Cookie過期時間
cookie.Path = "/";
//設置可訪問Cookie的路徑 為項目下的cookie文件夾及其子文件夾下所有頁面
//如果需要整個應用程序可訪問 則設置為cookie.Path = "/"; 即可
cookie.Domain = ".163.com";
//以www.163.com為例,若要在 news.163.com等不同主機訪問可以如上設置
//刪除舊的同名Cookie
HttpContext.Current.Response.Cookies.Remove(cookieName);
HttpContext.Current.Response.Cookies.Add(cookie);
}
/// 〈summary〉
/// 存Cookie
/// Json Lee 2007-09-24
/// 〈/summary〉
/// 〈param name="strName"〉名稱〈/param〉
/// 〈param name="strValue"〉值〈/param〉
/// 〈returns〉〈/returns〉
public void SetCookie(string cookieName, string cookieValue)
{
SetCookie(cookieName, cookieValue, 60);
}
/// 〈summary〉
/// 清除Cookie
/// 〈/summary〉
/// 〈param name="strName"〉名稱〈/param〉
/// 〈returns〉〈/returns〉
public void ClearCookie(string cookieName)
{
SetCookie(cookieName,"",-5);
}
/// 〈summary〉
/// 取Cookie
/// Json Lee 2007-09-24
/// 〈/summary〉
/// 〈param name="strName"〉名稱〈/param〉
/// 〈param name="strDefaultValue"〉當沒有值的時候的默認值〈/param〉
/// 〈returns〉〈/returns〉
public string GetCookie(string cookieName, string defaultValue)
{
cookieName = cookieName.ToLower();
string strResult = defaultValue;
try
{
if (HttpContext.Current.Request.Cookies != null)
{
if (HttpContext.Current.Request.Cookies[cookieName] != null)
{
strResult = HttpContext.Current.Request.Cookies[cookieName].Value;
}
}
}
catch (Exception ex)
{
this.WriteWrongLog(ex);
}
return strResult;
}
/// 〈summary〉
/// 取Cookie
/// Json Lee 2007-09-24
/// 〈/summary〉
/// 〈param name="strName"〉名稱〈/param〉
/// 〈returns〉〈/returns〉
public string GetCookie(string strName)
{
return GetCookie(strName, "");
}
#endregion
Cookie存取看起來的確很簡單,而在.NET里面好像更簡單。
但是......................
往往簡單的東西經常出現一些問題,讓人找不到原因。
我之前這里出現的問題就是,在寫Cookie的時候,沒有處理舊的同名Cookie,例如:第一次登錄的時候寫入 Cookie username=jsonlee 和 password=123456
有時候有可能會在未退出的情況下重新登錄一下,這樣就會再次寫入同樣的Cookie,但這樣的情況,好像沒有把原來的覆蓋(我用 IECookies 這個工具看到的),而是新加入一個同名的。這樣一來明顯問題就存在了。
所以我在SetCookie的方法里面加入了
//刪除舊的同名Cookie
HttpContext.Current.Response.Cookies.Remove(cookieName); 這樣一來問題就解決了。
IE頁面緩存的問題:
我現在的用戶登錄狀態是通過 Ajax調用一個 GetUserBar.aspx 來取得用戶狀態欄信息的
以下是 GetUserbar.aspx 的代碼
〈%@ Page language="c#" Codebehind="GetUserBar.aspx.cs" AutoEventWireup="false" Inherits="Web.GetUserBar" %〉
〈%if(CheckIsLogin()){%〉
您好:〈%=this.GetNickname()%〉
〈a href="〈%=UrlRewriteLink.GetUserHomeUrl()%〉"〉您的主頁〈/a〉 |
〈a href='/user/user_setup.aspx'〉個人設置〈/a〉 |
〈a href='/logout.aspx'〉退出〈/a〉
〈%}else{%〉
〈span style="margin-right:10px; "〉您已經登錄了!〈/span〉〈a href="/reg.aspx"〉注冊〈/a〉 | 〈a href="/login.aspx"〉登錄〈/a〉
〈%}%〉
如上面這段代碼,如果通過Ajax調用它,哪就可以在靜態頁面上取得用戶的登錄信息
可是.......
這個問題就出來了,而且還不容易發現,哪就是IE的頁面緩存,IE好像有個機制會把訪問過的頁面緩存到 C:\Documents and Settings\用戶名\Local Settings\Temporary Internet Files 這個文件夾里面。所以每個Ajax調用的GetUserBar.aspx時候IE取到的都是緩存信息,而不是GetUserBar.aspx運行的結果。所以才出現了,一直無法登出或無法登錄的狀態(其實是已經登錄登出了的,只是表面上看不出來)。
解決辦法就是在 GetUserBar.aspx 的Page_Load方法里面加入設定"Response.Expires"的時間的處理,如:
private void Page_Load(object sender, System.EventArgs e)
{
this.Response.Expires = 0;
}
這樣問題就解決了。
網上存在很多的Cookie操作的文章,可是這些東西都是抄來抄去的,哪個站長跟本就沒有對這些代碼做過測試,我以前試著看過好多個,很多是存在有問題的。
希望這篇文章會給需要的人帶來幫助。
轉載于:https://www.cnblogs.com/tiger8000/archive/2007/11/15/960538.html
總結
以上是生活随笔為你收集整理的谈谈 Cookie 存取和IE页面缓存的问题的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 实验五 数据库完整性技术
- 下一篇: 校讯通温馨提示