广州凡科互联网科技有限公司

营业时间
MON-SAT 9:00-18:00

全国服务热线
18720358503

公司门店地址
广州市海珠区工业大道北67号凤凰创意园

cookie是啥能够删掉吗?细说cookie(非常详尽)

日期:2021-02-18 浏览:
Cookie尽管是个非常简单的物品,但它也是WEB开发设计中一个太重要的顾客端数据信息来源于,并且它能够完成拓展性非常好的对话情况, 因此登博实例教程觉得每一个WEB开发设计工作人员都是有必需对它有一个清楚的了解。文中将对Cookie这一话题讨论做一个全方位的叙述, 也算作我对Cookie的了解小结。

返回顶端 Cookie 简述 Cookie是啥? Cookie 是一小段文字信息内容,随着着客户恳求和网页页面在 Web 网络服务器和访问器中间传送。Cookie 包括每一次客户浏览站点时 Web 运用程序都可以以载入的信息内容。

为何必须Cookie? 由于HTTP协议书是无情况的,针对一个访问器传出的数次恳求,WEB网络服务器没法区别 不是是来源于于同一个访问器。因此,必须附加的数据信息用以维护保养对话。Cookie 更是那样的一段随HTTP恳求一起被传送的附加数据信息。

Cookie能干什么? Cookie仅仅一段文字,因此它只有储存标识符串。并且访问器对它挺大小限定及其 它会伴随着每一次恳求被推送到网络服务器,因此应当确保它不必很大。Cookie的內容也是密文储存的,一些访问器出示页面改动,因此, 不适感合储存关键的或是涉及到隐私保护的內容。

Cookie 的限定。 大多数数访问器适用较大为 4096 字节数的 Cookie。因为这限定了 Cookie 的尺寸,最功能强大 Cookie 来储存小量数据信息,或是储存客户 ID 这类的标志符。客户 ID 接着即可用以标志客户,及其从数据信息库或别的数据信息源中载入客户信息内容。 访问器还限定站点能够再用户测算机上储存的 Cookie 的总数。大多数数访问器只容许每一个站点储存 20 个 Cookie;假如尝试储存大量 Cookie,则最旧的 Cookie 便会被抛弃。一些访问器还会继续对他们将接纳的来源于全部站点的 Cookie 数量做出肯定限定,一般为 300 个。

根据前边的內容,大家掌握到Cookie是用以保持服务端对话情况的,一般由服务端载入,在事后恳求中,供服务端载入。 下边文中将按这一全过程看一下Cookie是怎样从服务端载入,最终怎样传入服务端及其怎样载入的。

返回顶端 Cookie的写、读全过程 中,读写能力Cookie是根据应用HttpCookie类来进行的,它的界定以下:

public sealed class HttpCookie
 // 获得或设定将此 Cookie 两者之间关系的域。默认设置数值当今域。
 public string Domain { get; set; }
 // 获得或设定此 Cookie 的到期时间和時间(在顾客端)。
 public DateTime Expires { get; set; }
 // 获得一个值,根据该值标示 Cookie 是不是具备子键。
 public bool HasKeys { get; }
 // 获得或设定一个值,该值特定 Cookie 是不是可根据顾客端脚本制作浏览。
 // 假如 Cookie 具备 HttpOnly 特性且不可以根据顾客端脚本制作浏览,则为 true;不然为 false。默认设置为 false。
 public bool HttpOnly { get; set; }
 // 获得或设定 Cookie 的名字。
 public string Name { get; set; }
 // 获得或设定要与当今 Cookie 一起传送的虚似相对路径。默认设置数值当今恳求的相对路径。
 public string Path { get; set; }
 // 获得或设定一个值,该值标示是不是应用安全性套接字层 (SSL)(即仅根据 HTTPS)传送 Cookie。
 public bool Secure { get; set; }
 // 获得或设定单独 Cookie 值。默认设置数值空引入。
 public string Value { get; set; }
 // 获得单独 Cookie 目标所包括的键值对的结合。
 public NameValueCollection Values { get; }
 // 获得 System.Web.HttpCookie.Values 特性的便捷方法。
 public string this[string key] { get; set; }
新项目中写一个Cookie 高并发送至顾客端的访问器(以便简易也没有设定其他特性)。

HttpCookie cookie = new HttpCookie( MyCookieName , string value );
Response.Cookies.Add(cookie);
我觉得许多人都写过相近的编码,可是,大伙儿有木有想过:Cookie最终是怎样推送到顾客端的呢?大家开启Fiddler看来一一下吧。

从图中,您应当能发觉,大家在服务端写的Cookie,最终实际上是根据HTTP的响应头这类方式推送到顾客端的。每个载入姿势, 都是造成一个【Set-Cookie】的响应头。
访问器更是在每一次获得恳求的响应后,查验这种头来接受Cookie的。

新项目中载入一个Cookie

HttpCookie cookie = Request.Cookies[ MyCookieName ];
if( cookie != null )
 labCookie1.Text = cookie.Value;
 labCookie1.Text = 待定义 ;
编码一样也非常简单,還是相近的难题:大伙儿有木有想过,Cookie是怎样传入服务端的呢?大家還是再次应用Fiddler来找寻回答吧。

从照片中,大家能够发觉,Cookie是放到恳求头中,推送到服务端的。假如你一直更新网页页面,就可以发觉,每一次HTTP恳求,Cookie都是被推送。自然了,访问器都不是推送它所接受到的全部Cookie,它会查验当今要恳求的网站域名及其文件目录, 要是这二新项目与Cookie相匹配的Domain和Path配对,才会推送。针对Domain则是依照尾部配对的标准开展的。
因此,我还在浏览 时,访问器其实不会将我还在访问 所接受到的 Cookie 传出去。

删掉Cookie:实际上便是在写Cookie时,设定Expires为一个【先于如今時间的時间】。也便是:设定此Cookie早已到期, 访问器接受到这一Cookie时,便会删掉他们。

HttpCookie cookie = new HttpCookie( MyCookieName , null);
cookie.Expires = new DateTime(1900, 1, 1);
Response.Cookies.Add(cookie);
返回顶端 应用Cookie储存繁杂目标 前边的实例编码大概演试了Cookie的读写能力实际操作。但是,大家平常将会期待将更繁杂的【自定种类】根据Cookie来储存, 那麼又该怎样实际操作呢?针对这一难题,大家界定一个种类看来看怎样解决。

public class DisplaySettings 
 public int Style;
 public int Size;
 public override string ToString()
 return string.Format( Style = {0}, Size = {1} , this.Style, this.Size);
上边的编码,我界定一个种类,用以储存客户在访问网页页面时的显示信息设定。接下去,我将详细介绍二种方式在Cookie中储存并载入他们。

方式-1,經典作法。(留意前边得出的HttpCookie界定编码中的最终二个组员)

private void WriteCookie_2a()
 DisplaySettings setting = new DisplaySettings { Style = 1, Size = 24 };
 HttpCookie cookie = new HttpCookie( DisplaySettings1 );
 cookie[ Style ] = setting.Style.ToString();
 cookie[ Size ] = setting.Size.ToString();
 Response.Cookies.Add(cookie);
private void ReadCookie_2a()
 HttpCookie cookie = Request.Cookies[ DisplaySettings1 ];
 if( cookie == null )
 labDisplaySettings1.Text = 待定义 ;
 else {
 DisplaySettings setting = new DisplaySettings();
 setting.Style = cookie[ Style ].TryToInt();
 setting.Size = cookie[ Size ].TryToInt();
 labDisplaySettings1.Text = setting.ToString();
方式-2,将目标JSON编码序列化作标识符串。

private void WriteCookie_2b()
 DisplaySettings setting = new DisplaySettings { Style = 2, Size = 48 };
 HttpCookie cookie = new HttpCookie( DisplaySettings2 , setting.ToJson());
 Response.Cookies.Add(cookie);
private void ReadCookie_2b()
 HttpCookie cookie = Request.Cookies[ DisplaySettings2 ];
 if( cookie == null )
 labDisplaySettings2.Text = 待定义 ;
 else {
 DisplaySettings setting = cookie.Value.FromJson DisplaySettings ();
 labDisplaySettings2.Text = setting.ToString();
这一段编码应用了我界定的二个拓展方式。

/// summary
/// 将一个目标编码序列化成 JSON 文件格式标识符串
/// /summary
/// param name= obj /param
/// returns /returns
public static string ToJson(this object obj)
{
  if( obj == null )
  return string.Empty;

  JavaScriptSerializer jss = new JavaScriptSerializer();
  return jss.Serialize(obj);
}

/// summary
/// 从JSON标识符串中反编码序列化目标
/// /summary
/// typeparam name= T /typeparam
/// param name= cookie /param
/// returns /returns
public static T FromJson T (this string cookie)
{
  if( string.IsNullOrEmpty(cookie) )
  return default(T);

  JavaScriptSerializer jss = new JavaScriptSerializer();
  return jss.Deserialize T (cookie);
}
 

/// summary 
/// 将一个目标编码序列化成 JSON 文件格式标识符串
/// /summary 
/// param name= obj /param 
/// returns /returns 
public static string ToJson(this object obj)
 if( obj == null )
 return string.Empty;
 JavaScriptSerializer jss = new JavaScriptSerializer();
 return jss.Serialize(obj);
/// summary 
/// 从JSON标识符串中反编码序列化目标
/// /summary 
/// typeparam name= T /typeparam 
/// param name= cookie /param 
/// returns /returns 
public static T FromJson T (this string cookie)
 if( string.IsNullOrEmpty(cookie) )
 return default(T);
 JavaScriptSerializer jss = new JavaScriptSerializer();
 return jss.Deserialize T (cookie);
针对这二种方式,我本人更喜爱后面一种,由于它具备更强拓展性:假如种类提升了组员,不用改动读写能力Cookie的编码。
但是,这类方法造成的一些标识符,例如【双引号】,非常少数访问器(Opera)不兼容,因此必须做UrlEncode或是Base64编号解决。
同样,针对第一种方式,碰到Value有【双引号】时,大家一样必须做UrlEncode或是Base64编号解决。

返回顶端 Js中读写能力Cookie Cookie并不是只有在服务端读写能力,在顾客端的访问器中还可以完成对它的读写能力浏览。并且在JS中建立的Cookie针对服务端依然合理(由此可见), 接下去大家看来看在JS中怎样载入Cookie,演试编码将建立一个按键,并在点一下按键后载入Cookie

 input type= button onclick= WriteCookie(); value= WriteCookie / 
 script type= text/javascript 
 function WriteCookie() {
 var cookie = cookie_js=; path=/ ;
 document.cookie = cookie;
 /script 
在JS中写Cookie非常简单,要是给document.cookie取值一个Cookie标识符串就可以,对于文件格式,能够参照前边用Fiddle见到的結果。

再说看一下怎样应用JS载入Cookie吧。请参照以下编码:

 input type= button onclick= ReadCookie(); value= ReadCookie / 
 script type= text/javascript 
 function ReadCookie() {
 alert(document.cookie);
 /script 

依然是浏览document.cookie,但是,此次大家获得确是所有的Cookie值,每一个Key/Value项用分号分离,正中间则用百分号分离。 因此, 假如您想在JS中载入Cookie,一定要依照这一标准来分拆并分析您要载入的Cookie项。由于那样的实际操作一些繁杂, 大家能够jquery.cookie.js软件来轻轻松松进行这一作用,有兴趣爱好的朋友还可以看一下它是怎样解决的。 这一软件的编码较为少,这儿就立即贴出来,

/**
* Create a cookie with the given name and value and other optional parameters.
*
* @example $.cookie( the_cookie , the_value
* @desc Set the value of a cookie.
* @example $.cookie( the_cookie , the_value , {expires: 7, path: / , domain: , secure: true});
* @desc Create a cookie with all available options.
* @example $.cookie( the_cookie , the_value
* @desc Create a session cookie.
* @example $.cookie( the_cookie , null);
* @desc Delete a cookie by passing null as value.
*
* @param String name The name of the cookie.
* @param String value The value of the cookie.
* @param Object options An object literal containing key/value pairs to provide optional cookie attributes.
* @option Number|Date expires Either an integer specifying the expiration date from now on in days or a Date object.
*  If a negative value is specified (e.g. a date in the past), the cookie will be deleted.
*  If set to null or omitted, the cookie will be a session cookie and will not be retained
*  when the the browser exits.
* @option String path The value of the path atribute of the cookie (default: path of page that created the cookie).
* @option String domain The value of the domain attribute of the cookie (default: domain of page that created the cookie).
* @option Boolean secure If true, the secure attribute of the cookie will be set and the cookie transmission will
*  require a secure protocol (like HTTPS).
* @type undefined
*
* @name $.cookie
* @cat Plugins/Cookie
* @author Klaus Hartl/klaus.
*/

/**
* Get the value of a cookie with the given name.
*
* @example $.cookie( the_cookie
* @desc Get the value of a cookie.
*
* @param String name The name of the cookie.
* @return The value of the cookie.
* @type String
*
* @name $.cookie
* @cat Plugins/Cookie
* @author Klaus Hartl/klaus.
*/
jQuery.cookie = function(name, value, options) {
  if (typeof value != undefined ) { // name and value given, set cookie
  options = options || {};
  if (value === null) {
  value = ;
  options.expires = -1;
  }
  var expires = ;
  if (options.expires (typeof options.expires == number || options.expires.toUTCString)) {
  var date;
  if (typeof options.expires == number ) {
  date = new Date();
  date.setTime(date.getTime() + (options.expires * 24 * 60 * 60 * 1000));
  } else {
  date = options.expires;
  }
  expires = expires= + date.toUTCString(); // use expires attribute, max-age is not supported by IE
  }
  var path = options.path ? path= + options.path : ;
  var domain = options.domain ? domain= + options.domain : ;//
  var secure = options.secure ? secure : ;
  document.cookie = [name, = , encodeURIComponent(value), expires, path, domain, secure].join( );
  } else { // only name given, get cookie
  var cookieValue = null;
  if (document.cookie document.cookie != ) {
  var cookies = document.cookie.split( );
  for (var i = 0; i cookies.length; i++) {
  var cookie = jQuery.trim(cookies[i]);
  // Does this cookie string begin with the name we want?
  if (cookie.substring(0, name.length + 1) == (name + = )) {
  cookieValue = decodeURIComponent(cookie.substring(name.length + 1));
  break;
  }
  }
  }
  return cookieValue;
  }
};
 

 * Create a cookie with the given name and value and other optional parameters.
 * @example $.cookie( the_cookie , the_value 
 * @desc Set the value of a cookie.
 * @example $.cookie( the_cookie , the_value , {expires: 7, path: / , domain:  , secure: true});
 * @desc Create a cookie with all available options.
 * @example $.cookie( the_cookie , the_value 
 * @desc Create a session cookie.
 * @example $.cookie( the_cookie , null);
 * @desc Delete a cookie by passing null as value.
 * @param String name The name of the cookie.
 * @param String value The value of the cookie.
 * @param Object options An object literal containing key/value pairs to provide optional cookie attributes.
 * @option Number|Date expires Either an integer specifying the expiration date from now on in days or a Date object.
 * If a negative value is specified (e.g. a date in the past), the cookie will be deleted.
 * If set to null or omitted, the cookie will be a session cookie and will not be retained
 * when the the browser exits.
 * @option String path The value of the path atribute of the cookie (default: path of page that created the cookie).
 * @option String domain The value of the domain attribute of the cookie (default: domain of page that created the cookie).
 * @option Boolean secure If true, the secure attribute of the cookie will be set and the cookie transmission will
 * require a secure protocol (like HTTPS).
 * @type undefined
 * @name $.cookie
 * @cat Plugins/Cookie
 * @author Klaus Hartl/klaus.
 * Get the value of a cookie with the given name.
 * @example $.cookie( the_cookie 
 * @desc Get the value of a cookie.
 * @param String name The name of the cookie.
 * @return The value of the cookie.
 * @type String
 * @name $.cookie
 * @cat Plugins/Cookie
 * @author Klaus Hartl/klaus.
jQuery.cookie = function(name, value, options) {
 if (typeof value != undefined ) { // name and value given, set cookie
 options = options || {};
 if (value === null) {
 value = ;
 options.expires = -1;
 var expires = ;
 if (options.expires (typeof options.expires == number || options.expires.toUTCString)) {
 var date;
 if (typeof options.expires == number ) {
 date = new Date();
 date.setTime(date.getTime() + (options.expires * 24 * 60 * 60 * 1000));
 } else {
 date = options.expires;
 expires = expires= + date.toUTCString(); // use expires attribute, max-age is not supported by IE
 var path = options.path ? path= + options.path : ;
 var domain = options.domain ? domain= + options.domain : ;
 var secure = options.secure ? secure : ;
 document.cookie = [name, = , encodeURIComponent(value), expires, path, domain, secure].join( );
 } else { // only name given, get cookie
 var cookieValue = null;
 if (document.cookie document.cookie != ) {
 var cookies = document.cookie.split( );
 for (var i = 0; i cookies.length; i++) {
 var cookie = jQuery.trim(cookies[i]);
 // Does this cookie string begin with the name we want?
 if (cookie.substring(0, name.length + 1) == (name + = )) {
 cookieValue = decodeURIComponent(cookie.substring(name.length + 1));
 break;
 return cookieValue;
留意哦:前边大家见到了HttpCookie有一个HttpOnly特性,假如它为true,那麼JS是读不上哪个Cookie的,换句话说: 大家假如在服务端转化成的Cookie不期待在JS里能被浏览,能够在写Cookie时,设定这一特性。但是,根据一些专用工具,還是能看到他们。

中Cookie有什么运用。

返回顶端 Cookie在Session中的运用 中,HttpContext, Page目标都是有个Session的目标,大家可使用它来便捷地在服务端储存一些参会话有关的信息内容。
前边大家也提及过,HTTP协议书是无情况的,针对一个访问器传出的数次恳求,WEB网络服务器没法区别 不是是来源于于同一个访问器。因此,以便完成对话,服务端必须一个对话标志ID能储存到访问器,让它在事后的恳求时都携带这一对话标志ID,便于让服务端了解 某一恳求归属于哪一个对话,那样即可以维护保养参会话有关的情况数据信息。因为Cookie针对客户来讲,是个不能见的物品,并且每一次恳求都是传送到 服务端,中,默认设置也便是应用Cookie来储存这一ID的。 2.0也适用无Cookie的对话,但那类方法要改动URL,也是有它的缺陷,因而这类方式并沒有普遍的应用。文中将错误这一话题讨论做了多的剖析, 从此忽略无Cookie对话这类方法。

配备中,Web.config拥有以下界定:

 sessionState mode= InProc cookieName= ASP.NET_SessionId cookieless= UseCookies /sessionState 
假如大家实行下列实际操作:

Session[ Key1 ] = DateTime.Now;
这时,大家可使用一些访问器出示的专用工具来查询一下如今的Cookie状况。

从照片上看,这一Cookie的姓名便是大家在配备文档中强调的名字,大家能够改动一下配备文档:

 sessionState cookieName= SK /sessionState 
再说实行上边的写Session的实际操作,随后看Cookie

大家能看到:SK的Cookie出現了。表明:在截屏时我将名字为 ASP.NET_SessionId 的Cookie删掉了。

根据上边实例,大家能够获得结果,Session的完成是与Cookie相关的,服务端必须可能话标志ID储存到Cookie中。
这儿再一次声明,除非是你应用无Cookie的对话方式,不然Session是必须Cookie的适用。相反,Cookie其实不必须Session的适用。

返回顶端 Cookie在真实身份认证中的运用 的开发设计中应用过Form真实身份验证。针对一个客户恳求, 大家能够在服务端很便捷地分辨它不是是意味着一个已登陆客户。

this.labStatus.Text = (Request.IsAuthenticated ? 已登陆 : 未登陆 );
那麼,是怎样鉴别一个恳求不是是一个已登陆客户进行的呢?说到这儿,大家就需要从客户登陆谈起了。 以便完成登陆及Form验证方法,大家必须以下配备:

 authentication mode= Forms 
 forms name= UserStatus /forms 
 /authentication 
接下去,大家必须完成客户登陆逻辑性。实际完成方法有许多,但是,最后的启用全是类似的,以下编码所显示:

private void SetLogin()
 System.Web.Security.FormsAuthentication.SetAuthCookie( fish , false);
要是实行了之上编码,大家便可以见到,前边的分辨【Request.IsAuthenticated】回到true,最后会显示信息 已登陆 。 以便探索这一密秘,大家還是看来一下当今网页页面的Cookie状况。

果真,空出来一个Cookie,名字与我还在配备文档中特定的名字同样。大家再说看一下假如销户当今登陆会是啥模样的:

private void SetLogout()
 System.Web.Security.FormsAuthentication.SignOut();

见到了没有,名叫 UserStatus 的Cookie看不到了。这时假如你再去观查【Request.IsAuthenticated】,能够发觉它这时回到 false。 或是,您还可以再试一次,登陆后,立即删掉名叫 UserStatus 的Cookie,也可以发觉登陆情况将显示信息 未登陆 。 也许,您還是有点儿不清晰前边我启用【System.Web.Security.FormsAuthentication.SetAuthCookie( fish , false);】干了些甚么, 回应这一难题实际上非常简单:的完成吧。
能否认同我建立的Cookie,并觉得登陆合理。可以看编码:

private void SetLogin()
 //System.Web.Security.FormsAuthentication.SetAuthCookie( fish , false);
 // 下边的编码和上边的编码在功效上是等效电路的。
 FormsAuthenticationTicket ticket = new FormsAuthenticationTicket(
 2, fish , DateTime.Now, DateTime.Now.AddDays(30d), false, string.Empty);
 string str = FormsAuthentication.Encrypt(ticket);
 HttpCookie cookie = new HttpCookie(FormsAuthentication.FormsCookieName, str);
 Response.Cookies.Add(cookie);
假如实行这一段编码,您将发觉:【Request.IsAuthenticated】回到true,登陆情况会显示信息 已登陆 。
到此,大家能够得到一个结果:便是每一次查验大家在配备文档中特定的Cookie名字,并解密这一Cookie来分辨当今恳求客户的登陆情况。

返回顶端 Cookie的安全性情况 从之上照片,您应当能发觉:访问器能出示一些页面让客户清晰的观查大家在服务端写的Cookie, 乃至一些访问器还出示很便捷的改动作用。以下图所显示:

因此,大家在服务端敲代码载入Cookie时,特别是在是涉及到种类变换、反编码序列化或是解密时,一定要留意这种实际操作都是有将会会不成功。 并且图中也清晰的体现了一个客观事实:Cookie中的值全是 一目了然 的,一切人都可以看到他们。因此,大家尽可能不必立即在Cookie中 储存一些关键的或是比较敏感的內容。假如大家的确必须应用Cookie储存一些关键的內容,但又不期待被别人看懂, 大家可使用一些数据加密的方式来维护这种內容。

1. 针对一些关键性不太高的內容,大家可使用Base64这类的简易解决方法来解决。

2. 出示的一些数据加密专用工具类,自身设计制作数据加密方式来维护。但是, 登陆密码学与数据加密解密其实不是非常简单的优化算法,因而,自身设计方案的数据加密方法将会不容易很安全性。

3. 出示的FormsAuthenticationTicket,FormsAuthentication来数据加密。我觉得这类方法還是较为安全性的。 的Form真实身份验证便是应用这类方法来数据加密客户登陆的真实身份标志的,因此,假如这类方法躁动不安全, 的真实身份验证都不安全性了。 假如您应用这类方法来数据加密,那麼一定要注意:它造成的数据加密后文字還是较为大的, 前边因为我提及过,每一次恳求时,访问器都是携带与恳求相符合的全部Cookie,因而,这类Cookie会对传送特性造成一定的危害, 因此,请当心应用,谨记不能过量的应用。

 

返回顶端 怎样在C#发请的恳求中应用Cookie 前边大家一直在谈服务端与访问器中应用Cookie,实际上访问器也是一个一般的运用程序,.net framework也出示一些类也可以要我们 立即进行HTTP恳求,下边大家看来一下怎样在C#发请的恳求中应用Cookie ,实际上也非常简单,关键是应用了CookieContainer类,可以看下列演试编码:

private static string SendHttpRequestGet(string url, Encoding encoding, 
 CookieContainer cookieContainer)
 if( string.IsNullOrEmpty(url) )
 throw new ArgumentNullException( url );
 if( encoding == null )
 throw new ArgumentNullException( encoding );
 HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
 request.Method = GET ;
 request.CookieContainer = cookieContainer;
 using( WebResponse response = request.GetResponse() ) {
 using( StreamReader reader = new StreamReader(response.GetResponseStream(), encoding) ) {
 return reader.ReadToEnd();
 private void SendHttpDEMO()
 StringBuilder sb = new StringBuilder();
 CookieContainer cookieContainer = new CookieContainer();
 string url = / 后边能够再次进行HTTP恳求,这时可能包括之前从网络服务器载入的Cookie
 //SendHttpRequestGet( 同网站域名下的其他URL , Encoding.Default, cookieContainer);
 // 到此,大家能够显示信息获得了什么Cookie
 CookieCollection cookies = cookieContainer.GetCookies(new Uri(url));
 if( cookies != null ) {
 foreach( System.Net.Cookie cookie in cookies )
 sb.AppendLine(cookie.ToString());
 txtCookies.Text = sb.ToString();
返回顶端 重新构建与应用小结 出示的HttpCookie类来实际操作Cookie,是以便展现用初始的方法来应用Cookie, 这种编码有点儿反复,也是有点繁杂, 因此,我出示了好多个简易的方式能够更非常容易的应用Cookie,也算作对Cookie应用的一个小结。

/// summary 
/// 用以便捷应用Cookie的拓展专用工具类
/// /summary 
public static class CookieExtension
 // 大家能够为一些应用頻率高的种类写专业的【载入】方式
 /// summary 
 /// 从一个Cookie中载入标识符串值。
 /// /summary 
 /// param name= cookie /param 
 /// returns /returns 
 public static string GetString(this HttpCookie cookie)
 if( cookie == null )
 return null;
 return cookie.Value;
 /// summary 
 /// 从一个Cookie中载入 Int 值。
 /// /summary 
 /// param name= cookie /param 
 /// param name= defaultVal /param 
 /// returns /returns 
 public static int ToInt(this HttpCookie cookie, int defaultVal)
 if( cookie == null )
 return defaultVal;
 return cookie.Value.TryToInt(defaultVal);
 /// summary 
 /// 从一个Cookie中载入值并转成特定的种类
 /// /summary 
 /// typeparam name= T /typeparam 
 /// param name= cookie /param 
 /// returns /returns 
 public static T ConverTo T (this HttpCookie cookie)
 if( cookie == null )
 return default(T);
 return (T)Convert.ChangeType(cookie.Value, typeof(T));
 /// summary 
 /// 从一个Cookie中载入【JSON标识符串】值并反编码序列化成一个目标,用以载入繁杂目标
 /// /summary 
 /// typeparam name= T /typeparam 
 /// param name= cookie /param 
 /// returns /returns 
 public static T FromJson T (this HttpCookie cookie)
 if( cookie == null )
 return default(T);
 return cookie.Value.FromJson T ();

/// param name= expries /param public static void WriteCookie(this object obj, string name, DateTime? expries) if( obj == null ) throw new ArgumentNullException( obj ); if( string.IsNullOrEmpty(name) ) throw new ArgumentNullException( name );
// 删掉Cookie,实际上便是设定一个【到期的时间】 cookie.Expires = new DateTime(1900, 1, 1); HttpContext.Current.Response.Cookies.Add(cookie);
应用方法:

public static class TestClass
 public static void Write()
 string str = 我国 ;
 int aa = 25;
 DisplaySettings setting = new DisplaySettings { Style = 3, Size = 50 };
 DateTime dt = new DateTime(2012, 1, 1, 12, 0, 0);
 str.WriteCookie( Key1 , DateTime.Now.AddDays(1d));
 aa.WriteCookie( Key2 , null);
 setting.ToJson().WriteCookie( Key3 , null);
 dt.WriteCookie( Key4 , null);
 public static void Read()
 HttpRequest request = HttpContext.Current.Request;
 string str = request.Cookies[ Key1 ].GetString();
 int num = request.Cookies[ Key2 ].ToInt(0);
 DisplaySettings setting = request.Cookies[ Key3 ].FromJson DisplaySettings ();
 DateTime dt = request.Cookies[ Key4 ].ConverTo DateTime ();
留意哦:之上编码上都是立即应用标识符串 Key 的方式,这类方法针对大一些的程序在中后期将会会危害维护保养。
因此提议:将浏览Cookie所应用的Key能有一个类来统一的界定,或是将读写能力实际操作包裝成一些特性放到一个类中统一的管理方法。

public static class CookieValues
 // 提议把Cookie有关的主要参数放到一起,出示 get / set 特性(或是方式)到访问,以免 key 四处乱写
 public static string AAA
 get { return HttpContext.Current.Request.Cookies[ Key1 ].GetString(); }
 public static int BBB
 get { return HttpContext.Current.Request.Cookies[ Key2 ].ToInt(0); }
 public static DisplaySettings CCC
 get { return HttpContext.Current.Request.Cookies[ Key3 ].FromJson DisplaySettings (); }
 public static DateTime DDD
 get { return HttpContext.Current.Request.Cookies[ Key4 ].ConverTo DateTime (); }
返回顶端 依据一些朋友出示的意见反馈,这儿再填补4个必须留意的地区:

1. 假如应用Form登陆认证且期待应用Cookie方法时,提议设定 cookieless= UseCookies , 由于这一主要参数的默认设置值是:cookieless= UseDeviceProfile ,将会会错判。

 authentication mode= Forms 
 forms name= MyCookieName cookieless= UseCookies /forms 
 /authentication 
2. Cookie有3个特性,一般大家能够无需设定,但他们的值能够在Web.config中特定默认设置值:

 httpCookies domain=  httpOnlyCookies= true requireSSL= false / 
3. 尽管在写Cookie时,大家能够设定name, value以外的其他特性,可是在学取时,是读不上这种设定的。 实际上在我的实例编码中有反映,我前边也忘掉了表明了。

4. HttpRequest.Cookies 与 HttpResponse.Cookies 会出现关联(很怪异吧)。
下列编码演试了这一状况:

protected void Page_Load(object sender, EventArgs e)
 DateTime.Now.ToString().WriteCookie( t1 , null);
 label1.Text = ShowAllCookies();
 Guid.NewGuid().ToString().WriteCookie( t2 , null);
 // 假如除掉下边编码,可能见到两个t1 
 Response.Cookies.Remove( t1 );
 Response.Cookies.Remove( t2 );
private string ShowAllCookies()
 StringBuilder sb = new StringBuilder();
 for( int i = 0; i Request.Cookies.Count; i++ ) {
 HttpCookie cookie = Request.Cookies[i];
 sb.AppendFormat( {0}={1} br / , cookie.Name, cookie.Value);
 return sb.ToString();
上边的实验编码可能一直显示信息 t1 的Cookie ,这儿也不再贴图了。



网站知识

联系方式丨CONTACT

  • 全国热线:18720358503
  • 传真热线:18720358503
  • Q Q咨询:2639601583
  • 企业邮箱:2639601583@qq.com

首页
电话
短信
联系