惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

W
WeLiveSecurity
T
The Exploit Database - CXSecurity.com
C
CXSECURITY Database RSS Feed - CXSecurity.com
S
Security @ Cisco Blogs
T
Threat Research - Cisco Blogs
TaoSecurity Blog
TaoSecurity Blog
Recent Commits to openclaw:main
Recent Commits to openclaw:main
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
腾讯CDC
Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
T
The Blog of Author Tim Ferriss
Microsoft Azure Blog
Microsoft Azure Blog
罗磊的独立博客
F
Full Disclosure
博客园 - 【当耐特】
C
CERT Recently Published Vulnerability Notes
Engineering at Meta
Engineering at Meta
Application and Cybersecurity Blog
Application and Cybersecurity Blog
T
Threatpost
I
Intezer
V2EX - 技术
V2EX - 技术
H
Hackread – Cybersecurity News, Data Breaches, AI and More
The Hacker News
The Hacker News
小众软件
小众软件
Google DeepMind News
Google DeepMind News
T
Tailwind CSS Blog
D
Darknet – Hacking Tools, Hacker News & Cyber Security
B
Blog RSS Feed
Microsoft Security Blog
Microsoft Security Blog
N
News | PayPal Newsroom
MyScale Blog
MyScale Blog
AI
AI
Vercel News
Vercel News
Spread Privacy
Spread Privacy
美团技术团队
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
The GitHub Blog
The GitHub Blog
V
Vulnerabilities – Threatpost
Schneier on Security
Schneier on Security
Cyberwarzone
Cyberwarzone
G
GRAHAM CLULEY
Help Net Security
Help Net Security
Hacker News: Ask HN
Hacker News: Ask HN
Google DeepMind News
Google DeepMind News
MongoDB | Blog
MongoDB | Blog
L
LINUX DO - 热门话题
U
Unit 42
L
LangChain Blog
Recent Announcements
Recent Announcements

博客园 - Edison Zhu

Zhuanzai: change Asp.net Themes dynamicly (Setting An ASP.NET Theme in the PreInit Event Handler) zhuanzai: AJAX: How to create a "Processing" modal window using UpdateProgress and ModalPopup ASP.net AJAX controls - Edison Zhu 转:Manage Web.config from XML File by using configSource attribute ASP.Net 2.0 [转载] 微软SQL Server事务隔离级别实例简介 [转载] Moving table to a different filegroup in SQL 2005 [转载] SQL SERVER – 2005 – Database Table Partitioning Tutorial – How to Horizontal Partition Database Table [转载] SQL SERVER – 2005 – Introduction to Partitioning 转载:.NET Programming Standards and Naming Conventions [引]:聚集索引与非聚集索引 Trouble Shooting: can not access Excel file using excel control C#中小数点后保留两位小数,四舍五入的函数及使用方法 关于锁 IE7下关闭窗口不弹出提示窗口方法 [转]ASP.NET如何在客户端调用服务端代码 Operate File [转] 客户端的JavaScript脚本中获取服务器端控件的值 及ID BULK INSERT Temporary Tables [转]调用.NET XML Web Services返回数据集合
[转]谈谈Cookie存取和IE页面缓存的问题
Edison Zhu · 2007-12-06 · via 博客园 - Edison Zhu

最近老是发现在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()%>
<href="<%=UrlRewriteLink.GetUserHomeUrl()%>">您的主页</a> | 
<href='/user/user_setup.aspx'>个人设置</a> | 
<href='/logout.aspx'>退出</a>
<%}else{%>
<span style="margin-right:10px;">您已经登录了!</span><href="/reg.aspx">注册</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操作的文章,可是这些东西都是抄来抄去的,哪个站长跟本就没有对这些代码做过测试,我以前试着看过好多个,很多是存在有问题的。
希望这篇文章会给需要的人带来帮助。