谈谈 Cookie 存取和 IE 页面缓存的问题

最近老是发现在 IE 里会有 Cookie 的问题,如 IE 下面无法登出,或无法登录,或者登录后信息却无法取到,而 Firefox 下面一直是通过的,都试过好多次了,今天终于找回的主要的原因;

Cookie 的问题:

首先看一下我的 Cookie 存取代码 (这个 Cookie 操作支持二级域名访问)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
#region 存取 Cookie
///
/// 存 Cookie
/// Json Lee 2007-09-24
///
/// 名称
/// 值
/// 到期时间
///
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);
}

///
/// 存 Cookie
/// Json Lee 2007-09-24
///
/// 名称
/// 值
///
public void SetCookie(string cookieName, string cookieValue)
{
    SetCookie(cookieName, cookieValue, 60);
}

///
/// 清除 Cookie
///
/// 名称
///
public void ClearCookie(string cookieName)
{
    SetCookie(cookieName,"",-5);
}

///
/// 取 Cookie
/// Json Lee 2007-09-24
///
/// 名称
/// 当没有值的时候的默认值
///
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;
}

///
/// 取 Cookie
/// Json Lee 2007-09-24
///
/// 名称
///
public string GetCookie(string strName)
{
    return GetCookie(strName, "");
}
#endregion


Cookie 存取看起来的确很简单,而在.NET 里面好像更简单。
但是………………….
往往简单的东西经常出现一些问题,让人找不到原因。
我之前这里出现的问题就是,在写 Cookie 的时候,没有处理旧的同名 Cookie,例如:第一次登录的时候写入 Cookie username=jsonlee 和 password=123456
有时候有可能会在未退出的情况下重新登录一下,这样就会再次写入同样的 Cookie,但这样的情况,好像没有把原来的覆盖 (我用 IECookies 这个工具看到的),而是新加入一个同名的。这样一来明显问题就存在了。
所以我在 SetCookie 的方法里面加入了

1
2
//删除旧的同名 Cookie
HttpContext.Current.Response.Cookies.Remove(cookieName);

这样一来问题就解决了。


IE 页面缓存的问题:

我现在的用户登录状态是通过 Ajax 调用一个 GetUserBar.aspx 来取得用户状态栏信息的
以下是 GetUserbar.aspx 的代码

1
2
3
4
5
6
7
8
9
<%@ 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“的时间的处理,如:

1
2
3
4
5
private void Page_Load(object sender, System.EventArgs e)
{
    this.Response.Expires = 0;

}



这样问题就解决了。

网上存在很多的 Cookie 操作的文章,可是这些东西都是抄来抄去的,哪个站长跟本就没有对这些代码做过测试,我以前试着看过好多个,很多是存在有问题的。
希望这篇文章会给需要的人带来帮助。