最近老是发现在IE里会有Cookie的问题,如IE下面无法登出,或无法登录,或者登录后信息却无法取到,而Firefox下面一直是通过的,都试过好多次了,今天终于找回的主要的原因;
Cookie的问题:
首先看一下我的Cookie存取代码 (这个Cookie操作支持二级域名访问)
Cookie存取看起来的确很简单,而在.NET里面好像更简单。
但是......................
往往简单的东西经常出现一些问题,让人找不到原因。
我之前这里出现的问题就是,在写Cookie的时候,没有处理旧的同名Cookie,例如:第一次登录的时候写入 Cookie username=jsonlee 和 password=123456
有时候有可能会在未退出的情况下重新登录一下,这样就会再次写入同样的Cookie,但这样的情况,好像没有把原来的覆盖(我用 IECookies 这个工具看到的),而是新加入一个同名的。这样一来明显问题就存在了。
所以我在SetCookie的方法里面加入了
IE页面缓存的问题:
我现在的用户登录状态是通过 Ajax调用一个 GetUserBar.aspx 来取得用户状态栏信息的
以下是 GetUserbar.aspx 的代码
如上面这段代码,如果通过Ajax调用它,哪就可以在静态页面上取得用户的登录信息
可是.......
这个问题就出来了,而且还不容易发现,哪就是IE的页面缓存,IE好像有个机制会把访问过的页面缓存到 C:\Documents and Settings\用户名\Local Settings\Temporary Internet Files 这个文件夹里面。所以每个Ajax调用的GetUserBar.aspx时候IE取到的都是缓存信息,而不是GetUserBar.aspx运行的结果。所以才出现了,一直无法登出或无法登录的状态(其实是已经登录登出了的,只是表面上看不出来)。
解决办法就是在 GetUserBar.aspx 的Page_Load方法里面加入设定"Response.Expires"的时间的处理,如:
这样问题就解决了。
网上存在很多的Cookie操作的文章,可是这些东西都是抄来抄去的,哪个站长跟本就没有对这些代码做过测试,我以前试着看过好多个,很多是存在有问题的。
希望这篇文章会给需要的人带来帮助。
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
/// <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);
这样一来问题就解决了。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>
<%}%>
<%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;
}
{
this.Response.Expires = 0;
}
这样问题就解决了。
网上存在很多的Cookie操作的文章,可是这些东西都是抄来抄去的,哪个站长跟本就没有对这些代码做过测试,我以前试着看过好多个,很多是存在有问题的。
希望这篇文章会给需要的人带来帮助。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· [AI/GPT/综述] AI Agent的设计模式综述