• Cookie在IE缓存问题深度研究


     最近在发布net到生产环境的时候,测试发现了问题,IE的登录无效。 同样的版本在QA环境没有遇到问题。

    代码一样,chrome,firefox 都可以。就是IE不行,调试发现 登录完成,读取cookie 一直为空。 偶尔成功。

    注销也是失败,就去查代码,读取、删除cookie的方法,并未有什么问题,那就是缓存问题,对ajax 加上 cache:false,

    反复测试,一直折腾了很久,还是不能正常读取cookie。后来对所有涉及cookie的访问url都添加了时间戳,问题解决了。

    但是今天留意了一下下文,原理就是response对cookie的操作在IE存在缓存。 设置this.Response.Expires =0; 就不需要对所有访问cookile的url进行时间戳添加了。

    引文:

    谈谈 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 SettingsTemporary 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;

    }

      这样问题就解决了。

  • 相关阅读:
    Leetcode: N-Queens
    Leetcode: Sudoku Solver
    Leetcode: Binary Tree Maximum Path Sum
    Leetcode: Gas Station
    Leetcode: Convert Sorted List to Binary Search Tree
    Leetcode: Permutations II
    Leetcode: Reorder List && Summary: Reverse a LinkedList
    Leetcode: Unique Binary Search Trees II
    Leetcode: Subsets II
    Leetcode: Unique Paths II
  • 原文地址:https://www.cnblogs.com/Fly-sky/p/5394200.html
Copyright © 2020-2023  润新知