最近在发布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 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在IE缓存问题深度研究的更多相关文章

  1. 针对不同的Cookie做页面缓存

    有时我们需要为PC浏览器及移动浏览器生成不同的页面,为了提高性能,不能每次请求都去判断User-Agent,通常用一个 Cookie 标记一下客户端是否是移动客户端,这样只需要读取这个 Cookie ...

  2. J2EEweb开发中的缓存问题的研究

    一般情况下,浏览器都会缓存已经访问过的页面内容,关于如何禁止浏览器缓存的介绍,在网上到处都有相关的文章,但是,关于浏览器如何利用缓存,如何处理缓存的讲解,却鲜有人谈及 .浏览器在访问已缓存过的资源时, ...

  3. 深度研究:回归模型评价指标R2_score

    回归模型的性能的评价指标主要有:RMSE(平方根误差).MAE(平均绝对误差).MSE(平均平方误差).R2_score.但是当量纲不同时,RMSE.MAE.MSE难以衡量模型效果好坏.这就需要用到R ...

  4. Dotnet Core IHttpClientFactory深度研究

    今天,我们深度研究一下IHttpClientFactory.   一.前言 最早,我们是在Dotnet Framework中接触到HttpClient. HttpClient给我们提供了与HTTP交互 ...

  5. Cache,MemCache,Application,Cookie等其它缓存汇总

    为了提高网页运行速度我们用到了各种缓存技术,今天就来汇总下,相信聪明的你也一定会有所收获的o(^▽^)o 1.Cache(PS:看见一个博客介绍的不错,我就直接Copy了) Cache 即高速缓存.那 ...

  6. python_way day19 HTML-day5 (form表单验证,CSRF,cookie,session,缓存)

    python-way day19 1. dJango的form表单验证 2.CSRF 跨站请求伪造 3.cookie,session 4.缓存 一,django表单验证功能 1.django验证基础: ...

  7. 在关闭页面时自动清除Session cookie,页面缓存

    在默认情况下,session对象在关闭浏览器后并不是立刻被销毁,因此,为了考虑系统的安全性,在用户退出时,需要即刻清除session对象,防止他人盗用session对象中的信息. 清除session对 ...

  8. keystone 认证深度研究分析

    一.Keystone Token深度概述 Keystone作为OpenStack项目基础认证模块,目前支持的token类型分别是uuid.pkiz.pki.fernet. 首先,简要叙述一下这四种类型 ...

  9. [转]关于strtok和strtok_r函数的深度研究

    在linux环境下,字符串分割的函数中,大家比较常用的是strtok函数,这个函数用处很大,但也有一些问题,以下将深度挖掘一下这个函数的用法,原理,实现,其次,该函数是不可再入函数,但是在linux ...

随机推荐

  1. 优化JavaScripe 提升首页加载速度的几种方案解析

    优化目的: 1. 减少load量. 2. 优化js,加快页面加载速度. 网站中最影响网站打开速度的是什么?我会告诉是网站中的javascript,简称JS.模板中引用的JS文件越多,打开速度越慢,细读 ...

  2. Java就业指导

    想要成为合格的Java程序员或工程师到底需要具备哪些专业技能,面试者在面试之前到底需要准备哪些东西呢?本文陈列的这些内容既可以作为个人简历中的内容,也可以作为面试的时候跟面试官聊的东西,你可以把这些内 ...

  3. php函数的传值如果需要引用传递注意的细节

    Strict standards: Only variables should be passed by reference 网上查到资料有这么一句话: 在php5.3以上版本会出这个问题,应该也和p ...

  4. 实体类在Windows程序中的高级应用--------------------》》心境是一种境界。

    一.事务 我们在大家学到这,或多或少对事务都有一些理解了.今天的我也对事务有了更深一层的理解对我来说,我想与大家一起分享一下. 解析: 1.ADO.NET提供了事务处理功能 2.C#中开启事务 3.在 ...

  5. 使用CTE解决复杂查询的问题

    最近,同事需要从数个表中查询用户的业务和报告数据,写了一个SQL语句,查询比较慢: Select S.Name, S.AccountantCode, ( Select COUNT(*) from ( ...

  6. AngularJs学习第一课 Hello World

    首先先介绍一下:AngularJS是干什么的. AngularJS是为了克服HTML在构建应用上的不足而设计的.HTML是一门很好的为静态文本展示设计的声明式语言,但要构建WEB应用的话它就显得乏力了 ...

  7. ubuntu15.10_x64 安装 nginx

      浏览器到 http://nginx.org/en/download.html 下载 stable version的nginx 如nginx-1.10.1.tar.gz,这是一个nginx源码包,需 ...

  8. fakeLoader页面加载前loading演示8种效果

    提高用户体验的插件fakeLoader页面加载前loading演示8种效果 在线预览 下载地址 示例代码 <div id="main"> <div class=& ...

  9. Typecast 免费了!献给设计师们的礼物

    TypeCast 让你可以从 Fonts.com.TypeKit.FontDeck 和 Google 这些字体供应和商选择字体,而且能非常方便的比较这些字体使用效果.如果你想获得用户对这些字体效果的反 ...

  10. jQuery的deferred对象使用详解——实现ajax线性请求数据

    最近遇到一个ajax请求数据的问题 ,就是想要请求3个不同的接口,然后请求完毕后对数据进行操作,主要问题就是不知道这3个请求誰先返回来,或者是在进行操作的时候不能保证数据都已经回来,首先想到能完成的就 ...