public class Cookies
{
/// <summary>
/// 添加cookie
/// </summary>
/// <param name="cookieName"></param>
/// <param name="value"></param>
public static void Add(string cookieName, string value)
{
HttpCookie cookie = new HttpCookie(HttpUtility.UrlEncode(cookieName), HttpUtility.UrlEncode(value));
HttpContext.Current.Response.AppendCookie(cookie);
}
/// <summary>
/// 給指定的cookie的指定鍵添加值
/// </summary>
/// <param name="cookieName">cookie的名稱</param>
/// <param name="keyName">要添加的鍵</param>
/// <param name="value">要添加的值</param>
public static void Add(string cookieName, string keyName, string value)
{
HttpCookie cookie = HttpContext.Current.Request.Cookies[cookieName];
//如果cookie=null則新建一個cookie
if (cookie == null)
cookie = new HttpCookie(HttpUtility.UrlEncode(cookieName));
//如果該鍵不存在,則新建一個鍵值並賦值;否則直接賦值
if (string.IsNullOrEmpty(cookie.Values[keyName]))
cookie.Values.Add(keyName, HttpUtility.UrlEncode(value));
else
cookie.Values[keyName] = HttpUtility.UrlEncode(value);
HttpContext.Current.Response.AppendCookie(cookie);
}
/// <summary>
/// 讀取Cookie
/// </summary>
/// <param name="key"></param>
/// <returns></returns>
public static string GetValue(string cookieName)
{
string value = HttpContext.Current.Request.Cookies[HttpUtility.UrlEncode(cookieName)].Value;
return string.IsNullOrEmpty(value) ? string.Empty : HttpUtility.UrlDecode(value);
}
/// <summary>
/// 讀取指定Cookie裏的指定鍵的值
/// </summary>
/// <param name="cookieName">cookie名稱</param>
/// <param name="keyName">cookie的鍵</param>
/// <returns></returns>
public static string GetValue(string cookieName, string keyName)
{
HttpCookie cookie = HttpContext.Current.Request.Cookies[HttpUtility.UrlEncode(cookieName)];
if (cookie == null)
return string.Empty;
string value = cookie.Values[HttpUtility.UrlEncode(keyName)];
return string.IsNullOrEmpty(value) ? string.Empty : HttpUtility.UrlDecode(value);
}
/// <summary>
/// 獲取指定cookie中所有的鍵
/// </summary>
/// <param name="cookieName"></param>
/// <returns></returns>
public static string[] GetValues(string cookieName)
{
if (HttpContext.Current.Request.Cookies[cookieName] == null)
return new string[0];
string[] keys = HttpContext.Current.Request.Cookies[cookieName].Values.AllKeys;
for (int i = 0; i < keys.Length; i++)
{
keys[i] = HttpUtility.UrlDecode(keys[i]);
}
return keys;
}
/// <summary>
/// 移除指定的Cookie
/// </summary>
/// <param name="cookieName"></param>
public static void Remove(string cookieName)
{
HttpContext.Current.Response.Cookies.Remove(HttpUtility.UrlEncode(cookieName));
HttpContext.Current.Response.Cookies[HttpUtility.UrlEncode(cookieName)].Expires = DateTime.Now.AddDays(-1);
}
/// <summary>
/// 移除cookie中指定的鍵,若是最後一個鍵則移除這個cookie
/// </summary>
/// <param name="cookieName"></param>
/// <param name="keyName"></param>
public static void Remove(string cookieName, string keyName)
{
HttpCookie cookie = HttpContext.Current.Request.Cookies[cookieName];
if (cookie != null)
{
if (cookie.Values.Count > 0)
{
if (cookie.Values.Count == 1)
{
//若是最後一個鍵則移除這個cookie,否則會多出一個空值
cookie.Values.Remove(HttpUtility.UrlEncode(keyName));
cookie.Expires = DateTime.Now.AddDays(-1);
}
else
{
cookie.Values.Remove(HttpUtility.UrlEncode(keyName));
}
HttpContext.Current.Response.Cookies.Add(cookie);
}
}
}
}
首先要了解Cookie是存在客戶端的。
添加cookie是向客戶端添加cookie,所以要用(Response)HttpContext.Current.Response.AppendCookie(cookie);
獲取cookie是獲取客戶端提交上來的cookie,所以要用(Request)HttpContext.Current.Request.Cookies[cookieName];
服務器端沒有權限刪除客戶端上的文件,所以服務器端,不能刪除cookie。但可以讓瀏覽器刪除,即讓cookie過期。
關於cookie讀取中文cookie時出現亂碼:存儲中文時要進行編碼,讀取中文時則進行解碼,這樣可以避免出現亂碼。
cookie中存儲數據的格式是以值鍵對的形式存儲的:即 key1=value1&key2=value2;
所以
cookie.Values.Add(key1, value1);
和
cookie.Value=cookie.Value+"&key1=value1"
是等同的。但是後者在Request.Cookies[cookieName].Values.Count時則會變成1。
可能是加上新值之後編碼不一所以count的時候變成了1