C# ASP.NET 中 Cookie 的创建、读取与删除操作指南
在 C# ASP.NET 开发中,Cookie 是维持用户会话状态的重要工具。本文整理了基于 System.Web 命名空间的 Cookie 基础操作,包括通过 HttpCookie 设置单一或复合(子键)数据,从请求中安全提取值,以及通过修改过期时间删除 Cookie。此外,还介绍了处理中文编码乱码和配置跨域名访问的注意事项。
核心概念与准备
在 .NET Framework (ASP.NET Web Forms/MVC) 环境下,Cookie 通过 System.Web.HttpCookie 类进行实例化和管理。所有的操作均在 HTTP 请求(Request)和响应(Response)上下文中完成。操作前需确保引用了 System.Web 命名空间。
Cookie 的基本操作
第1步:创建 Cookie(单值模式)
目的:向客户端浏览器写入一个简单的键值对 Cookie。
方法演示:
// 方法一:直接赋值属性
Response.Cookies["username"].Value = "admin";
Response.Cookies["username"].Expires = DateTime.Now.AddDays(1); // 有效期为1天
// 方法二:实例化对象后添加
System.Web.HttpCookie newCookie = new HttpCookie("username");
newCookie.Value = "oneday";
newCookie.Expires = DateTime.Now.AddDays(1);
Response.AppendCookie(newCookie); // 也可使用 Response.Cookies.Add()
第2步:创建带子键的 Cookie(集合模式)
目的:在不增加 Cookie 总数量限制的前提下,存储多个相关字段。一个主 Key 下可包含多个 Value。
System.Web.HttpCookie userCookie = new HttpCookie("user");
userCookie.Values["username"] = "admin";
userCookie.Values["password"] = "secret123";
userCookie.Expires = DateTime.Now.AddDays(1);
Response.AppendCookie(userCookie);
第3步:读取 Cookie 值
目的:从当前请求中提取已存在的 Cookie 数据。
无子键读取:
if (Request.Cookies["username"] != null)
{
// 建议对输出内容进行 HtmlEncode 以防 XSS
Response.Write(Server.HtmlEncode(Request.Cookies["username"].Value));
}
有子键读取:
if (Request.Cookies["user"] != null)
{
string name = Request.Cookies["user"]["username"];
string pass = Request.Cookies["user"]["password"];
Response.Write(Server.HtmlEncode(name));
Response.Write(Server.HtmlEncode(pass));
}
第4步:删除 Cookie
目的:使特定 Cookie 在客户端失效。
原理:无法直接从服务端“删除”客户端的 Cookie 文件,只能通过创建一个同名且已过期的 Cookie 来覆盖原值。
if (Request.Cookies["name"] != null)
{
Request.Cookies["name"].Expires = DateTime.Now.AddDays(-1);
Response.SetCookie(Request.Cookies["name"]);
}
Cookie 工具类封装示例
为了避免重复代码,通常会将上述逻辑封装为一个静态 Helper 类。该类包含了设置、读取和删除的标准实现。
using System;
using System.Web;
public class CookieHelper
{
/// <summary>
/// 设置 Cookie 值
/// </summary>
/// <param name="strName">主键名称</param>
/// <param name="strValue">键值内容</param>
/// <param name="strDay">有效天数</param>
public static bool SetCookie(string strName, string strValue, int strDay)
{
try
{
HttpCookie cookie = new HttpCookie(strName);
// 如需跨域名共享,取消下方注释并填写域名,如 ".example.com"
// cookie.Domain = ".xxx.com";
cookie.Expires = DateTime.Now.AddDays(strDay);
cookie.Value = strValue;
HttpContext.Current.Response.Cookies.Add(cookie);
return true;
}
catch
{
return false;
}
}
/// <summary>
/// 读取 Cookie 值
/// </summary>
/// <param name="strName">主键名称</param>
public static string GetCookie(string strName)
{
HttpCookie cookie = HttpContext.Current.Request.Cookies[strName];
if (cookie != null)
{
return cookie.Value.ToString();
}
return null;
}
/// <summary>
/// 删除指定 Cookie
/// </summary>
/// <param name="strName">主键名称</param>
public static bool DelCookie(string strName)
{
try
{
HttpCookie cookie = new HttpCookie(strName);
// 需保持与 SetCookie 相同的 Domain 设置(如果有)
// cookie.Domain = ".xxx.com";
cookie.Expires = DateTime.Now.AddDays(-1);
HttpContext.Current.Response.Cookies.Add(cookie);
return true;
}
catch
{
return false;
}
}
}
使用示例与常见问题
基本调用示例
CookieHelper.SetCookie("name", "value", 1);
string val = CookieHelper.GetCookie("name");
CookieHelper.DelCookie("name");
注意:中文乱码问题
如果在 Cookie 中存储中文字符,部分旧版浏览器或配置可能会导致乱码。建议在设置时进行 URL 编码,读取后进行解码:
// 设置时编码
CookieHelper.SetCookie("desc", Server.UrlEncode("测试中文"), 1);
// 读取时解码
string decodedVal = HttpUtility.UrlDecode(CookieHelper.GetCookie("desc"));
关于生命周期
如果创建 Cookie 时不指定 Expires 属性,该 Cookie 将成为“会话 Cookie”,仅在内存中存在。当用户关闭浏览器标签页或整个浏览器时,该 Cookie 将自动失效,不会保存到磁盘上。
跨域访问提示
默认情况下,Cookie 只能被其创建的域名下的页面访问。若需在子域名之间共享 Cookie(如从 a.example.com 读取 b.example.com 设置的 Cookie),必须在创建时显式指定 Domain 属性为父域名(如 ".example.com")。删除时也需保持该设置一致,否则无法覆盖。
以上就是 C# ASP.NET 中 Cookie 创建、读取和删除操作的详细内容,更多关于 .NET Web 开发的资料请关注本站其它相关文章!
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









