透明 发表于 2015-1-16 22:35:22

ASP.NET网页编程之揭开ASP.NET中Cookie编程的奥妙

c++是语言,其实C++和java的应用范围根本就不一样的。在java应用的领域内,c++是不合适的。所以微软才搞了C#和Java对抗。asp.net|cookie|编程  简介</B>

  Cookie为Web使用程序保留用户相干信息供应了一种有效的办法。比方,当用户会见您的站点时,您能够使用Cookie保留用户首选项或其他信息,如许,当用户下次再会见您的站点时,使用程序就能够检索之前保留的信息。

  本文提要先容Cookie在ASP.NET使用程序中的使用,为您展现在ASP.NET中使用Cookie的手艺细节,比方编写Cookie、然后再读取它们。同时,还将为您先容Cookie的各类特征和各类特别情形,和ASP.NET对Cookie的撑持。

  甚么是Cookie?

  Cookie是一小段文本信息,陪伴着用户哀求和页面在Web服务器和扫瞄器之间传送。用户每次会见站点时,Web使用程序都能够读取Cookie包括的信息。

  假定在用户哀求会见您的网站www.contoso.com上的某个页面时,您的使用程序发送给该用户的不单单是一个页面,另有一个包括日期和工夫的Cookie。用户的扫瞄器在取得页面的同时还失掉了这个Cookie,而且将它保留在用户硬盘上的某个文件夹中。

  今后,假如该用户再次会见您站点上的页面,当该用户输出URLwww.contoso.com时,扫瞄器就会在当地硬盘上查找与该URL相干联的Cookie。假如该Cookie存在,扫瞄器就将它与页面哀求一同发送到您的站点,您的使用程序就可以断定该用户上一次会见站点的日期和工夫。您能够依据这些信息向用户发送一条动静,也能够反省过时工夫或实行其他有效的功效。

  Cookie是与Web站点而不是与详细页面联系关系的,以是不管用户哀求扫瞄站点中的哪一个页面,扫瞄器和服务器都将互换www.contoso.com的Cookie信息。用户会见其他站点时,每一个站点都大概会向用户扫瞄器发送一个Cookie,而扫瞄器会将一切这些Cookie分离保留。

  以上就是Cookie的基础事情道理。那末,Cookie有哪些用处呢?最基本的用处是Cookie可以匡助Web站点保留有关会见者的信息。更归纳综合地说,Cookie是一种坚持Web使用程序一连性(即实行“形态办理”)的办法。扫瞄器和Web服务器除在长久的实践信息互换阶段之外老是断开的,而用户向Web服务器发送的每一个哀求都是独自处置的,与其他一切哀求有关。但是在年夜多半情形下,都有需要让Web服务器在您哀求某个页面时对您举行辨认。比方,购物站点上的Web服务器跟踪每一个购物者,以便站点可以办理购物车和其他的用户相干信息。因而Cookie的感化就相似于咭片,它供应了相干的标识信息,能够匡助使用程序断定怎样持续实行。

  利用Cookie可以到达多种目标,一切这些目标都是为了使Web站点记着您。比方,一个实行平易近意检验的站点能够复杂天时用Cookie作为布尔值,暗示您的扫瞄器是不是已介入了投票,从而制止您反复投票;而那些请求用户登录的站点则能够经由过程Cookie来断定您是不是已登录过,如许您就不用每次都输出凭证。

  有关Cookie的更多背景信息,倡议您浏览VerizonWeb站点中的“HowInternetCookiesWork”一文,地点为http://www22.verizon.com/about/community/learningcenter/articles/displayarticle1/0,4065,1022z1,00.html(英文)。其作者具体注释了甚么是Cookie和Cookie是怎样在扫瞄器和服务器之间互换信息的,他还周全总结了Cookie触及的隐私成绩。

  特地问一下,您是不是想晓得它们为何被称作“Cookie”?JargonFile(又称为“TheNewHackersDictionary”)版本4.3.3对这一术语的词源给出了正确的界说和公道的注释。您能够在http://www.catb.org/~esr/jargon/jargon.html#cookie(英文)找到相干的条目。

  在今后的内容中,本文将假定您已晓得甚么是Cookie,而且假定您已分明为何要在ASP.NET使用程序中利用Cookie。
<P>  Cookie的限定

  在入手下手会商Cookie的手艺细节之前,我想先先容一下Cookie使用的几条限定。年夜多半扫瞄器撑持最多可达4096字节的Cookie,假如要将为数未几的几个值保留到用户盘算机上,这一空间已充足年夜,但您不克不及用一个Cookie来保留数据集或其他大批数据。在实践使用中,您大概其实不但愿在Cookie中保留大批的用户信息,而只但愿保留用户编号或其他标识符。以后,当用户再次会见您的站点时,您就能够利用该用户ID在数据库中查找用户的具体信息。(有关保留用户信息的申明,请参阅Cookie和平安性。)

  扫瞄器还限定了您的站点能够在用户盘算机上保留的Cookie数。年夜多半扫瞄器只同意每一个站点保留20个Cookie。假如试图保留更多的Cookie,则开始保留的Cookie就会被删除。另有些扫瞄器会对来自一切站点的Cookie总数作出限定,这个限定一般为300个。

  您最大概碰到的Cookie限定是:用户能够设置本人的扫瞄器,回绝承受Cookie。您很难明决这个成绩,除非完整不利用Cookie而是经由过程其他机制来保留用户相干信息。保留用户信息的一种经常使用办法是会话形态,但会话形态又依附于Cookie。这一点在前面的Cookie和会话形态中论述。

  注重:有关形态办理和Web使用程序顶用于保留信息的选项的具体信息,请参阅IntroductiontoWebFormsState(英文)和StateManagementRecommendations(英文)。
更一样平常的履历极可能是,只管Cookie在使用程序中十分有效,使用程序也不该该依附于可以保留Cookie。使用Cookie能够做到如虎添翼,但不要使用它们来撑持关头功效。假如您的使用程序必需利用Cookie,则您能够经由过程测试来断定扫瞄器是不是承受Cookie。我在本文前面的反省扫瞄器是不是承受Cookie一节中复杂先容了一种测试办法。

  编写Cookie

  您能够使用页面的Response(英文)属性来编写Cookie,该属性供应的工具利用户能够将信息增加到由页面向扫瞄器出现的信息中。Response工具撑持一个名为Cookies(英文)的汇合,您能够向个中增加要写进扫瞄器的Cookie。

  注重:上面要会商的Response工具和Request工具分离是包括HttpResponse(英文)和HttpRequest(英文)类实例的页面的属性。要在文档中查找Response和Request的信息,请参阅HttpResponse和HttpRequest下的内容。

  在创立Cookie时,您必要指定几个值。最后,您要指定Cookie的称号和个中保留的值。您能够创立多个Cookie,每一个Cookie都必需具有独一的称号,以便往后读取时辨认。(Cookie是按称号保留的,以是假如您创立了两个称号不异的Cookie,后保留的那一个将掩盖前一个。)

  您大概还但愿指定Cookie的过时日期和工夫。Cookie一样平常都写进到用户的磁盘,然后大概一向都留在磁盘上。因而,您能够指定Cookie过时的日期和工夫。当用户再次会见您的站点时,扫瞄器会先反省您站点的Cookie汇合,假如某个Cookie已过时,扫瞄器不会把这个Cookie随页面哀求一同发送给服务器,而是删除这个已过时的Cookie。(您的站点大概已在用户盘算机上写进了多个Cookie,每一个Cookie都有各自的过时日期和工夫。)请注重,由扫瞄器卖力办理硬盘上的Cookie,这将影响您在使用程序中对Cookie的利用,我很快会先容这方面的内容。

  一个Cookie的无效期应为多长?这取决于Cookie的用处,换句话说,取决于您的使用程序必要Cookie值坚持无效的工夫有多长。假如使用Cookie统计网站的会见者,您能够把无效期设置为1年,假如某个用户已有一年工夫未会见您的站点,则能够把该用户看成新的会见者;假如使用Cookie来保留用户的首选项,则能够把其设置为永久无效(比方50年后到期),由于按期从头设置首选项对用户而言是对照贫苦的。偶然,您大概必要编写在数秒或数分钟内即过时的Cookie。在本文前面的反省扫瞄器是不是承受Cookie一节中,我枚举了一个示例,该示例中创立的Cookie的实践无效期就只要几秒。

  注重:不要健忘用户随时能够删除本人盘算机上的Cookie,以是即便您保留了临时无效的Cookie,用户也能够自行决意将其全体删除,同时扫除保留在Cookie中的一切设置。

  假如没有设置Cookie的无效期,仍是能够创立Cookie,但它不会保留到用户的硬盘上,而是会成为用户会话信息的一部分。假如用户封闭扫瞄器或会话超时,该Cookie就会被删除。这类非永世性的Cookie很合适用来保留只需短工夫保留的信息,大概保留因为平安缘故原由不该该写进客户盘算机磁盘的信息。比方,假如用户利用的是一台公用盘算机,而您不但愿把Cookie写进这类盘算机的磁盘上,这时候就能够利用非永世性的Cookie。

  您能够经由过程多种办法把Cookie增加到Response.Cookies汇合中。以下示例先容了两种完成此义务的办法:

Response.Cookies("userName").Value="mike"
Response.Cookies("userName").Expires=DateTime.Now.AddDays(1)

DimaCookieAsNewHttpCookie("lastVisit")
aCookie.Value=DateTime.Now.ToString
aCookie.Expires=DateTime.Now.AddDays(1)
Response.Cookies.Add(aCookie)
  该示例向Cookies汇合中增加了两个Cookie,一个称为“userName”,另外一个称为“lastVisit”。关于第一个Cookie,我间接设置了Response.Cookies汇合的值。您可使用这类办法向汇合中增加值,由于Response.Cookies是从NameObjectCollectionBase(英文)范例的特别汇合派生失掉的。

  关于第二个Cookie,我创立了Cookie工具的一个实例(HttpCookie[英文]范例),并设置了其属性,然后经由过程Add办法把它增加到Response.Cookies汇合。实例化HttpCookie工具时,您必需把Cookie称号作为机关函数的一部分举行传送。

  这两个示例完成了不异的义务,即向扫瞄器写进一个Cookie。您要接纳哪一种办法次要取决于您的团体喜欢。您大概会发明第二种办法在设置Cookie属性方面要略微简单一些,但同时您也会注重到二者的不同并非很年夜。

  在这两种办法中,无效期值必需为DateTime范例。而“lastVisited”值也是日期/工夫值。但在这类情形下,我必需把日期/工夫值转换为字符串,由于Cookie中的任何值终极都是以字符串的情势保留的。
<P>  检察您的Cookie

  您大概会发明,懂得创立Cookie的效果会对您很有匡助。而检察Cookie是对照简单的,由于它们都是文本文件,关头在于您能找到它们。分歧的扫瞄器保留Cookie的体例也分歧。我将先容InternetExplorer是怎样保留Cookie的。假如您利用的是其他扫瞄器,请检察该扫瞄器的匡助,以懂得有关Cookie处置方面的常识。

  检察Cookie的一个烦琐办法是让InternetExplorer为您查找。在InternetExplorer中,从“工具”菜单当选择“Internet选项”,在“惯例”选项卡中单击“设置”,然后单击“检察文件”。InternetExplorer将翻开一个窗口,显现一切的一时文件,包含Cookie。在窗口中查找以“Cookie:”开首的文件或查找文本文件。双击一个Cookie,在默许的文本文件中翻开它。

  您也能够在硬盘上查找Cookie的文本文件,从而翻开Cookie。InternetExplorer将站点的Cookie保留在文件名格局为<user>@<domain>.txt的文件中,个中<user>是您的帐户名。比方,假如您的称号为mikepope,您会见的站点为www.contoso.com,那末该站点的Cookie将保留在名为mikepope@www.contoso.txt的文件中。(该文件名大概包括一个按次的编号,如mikepope@www.contoso.txt。)

  这个Cookie文本文件是与用户相干的,以是会依照帐户分离保留。比方,在WindowsXP中,您能够在以下所示的目次中找到Cookie文件:

c:DocumentsandSettings<user>Cookies

  要查找最新创立的Cookie,能够按修正日期对目次内容举行排序,并查找比来修正的文件。

  您可使用文本编纂器翻开Cookie。假如该文件包括多个Cookie,这些Cookie之间将用星号(*)分开。每一个Cookie的第一行是Cookie的称号,第二行是值,其他各行则包括Cookie的一样平常处置信息,比方过时日期和工夫。Cookie中另有一个复杂的校验和,假如变动Cookie称号或值的长度,扫瞄器就会检测到修正并删除该Cookie。

  多值Cookie(子键)

  以上示例为每一个要保留的值(用户名、前次会见工夫)都利用了一个Cookie。您也能够在一个Cookie中保留多个称号/值对。称号/值对也称作“键”或“子键”,详细取决于您读取的内容。(假如您熟习URL的布局,就会发明子键与个中的查询字符串十分相象。)比方,假如不但愿创立名为“userName”和“lastVisit”的两个独自的Cookie,能够创立一个名为“userInfo”的Cookie,并使其包括两个子键:“userName”和“lastVisit”。

  有良多缘故原由会让我们用子键来取代独自的Cookie。最不言而喻的是,把相干或相似的信息放在一个Cookie中会对照有层次。别的,因为一切信息都在一个Cookie中,以是诸若有效期之类的Cookie属性就合用于一切信息。(固然,假如要为分歧范例的信息指定分歧的过时日期,就应当把信息保留在独自的Cookie中。)

  带有子键的Cookie还能够匡助您减小Cookie的巨细。如后面的Cookie的限定一节所述,Cookie的总巨细限定在4096字节之内,并且不克不及为一个网站保留凌驾20个Cookie。使用带子键的单个Cookie,站点的Cookie数目就不会凌驾20个的限定。别的,一个Cookie会占用约莫50个字符的基础空间开支(用于保留无效期信息等),再加上个中保留的值的长度,其总和靠近4K的限定。假如利用五个子键而不是五个独自的Cookie,您能够省往四个Cookie的基础空间开支,统共能节俭约莫200个字节。

  要创立带子键的Cookie,您可使用用于编写单个Cookie的各类语法。以下示例显现了编写统一Cookie的两种分歧办法,个中的每一个Cookie都带有两个子键:

Response.Cookies("userInfo")("userName")="mike"
Response.Cookies("userInfo")("lastVisit")=DateTime.Now.ToString
Response.Cookies("userInfo").Expires=DateTime.Now.AddDays(1)

DimaCookieAsNewHttpCookie("userInfo")
aCookie.Values("userName")="mike"
aCookie.Values("lastVisit")=DateTime.Now.ToString
aCookie.Expires=DateTime.Now.AddDays(1)
Response.Cookies.Add(aCookie)
  把持Cookie无效局限

  默许情形下,一个站点的全体Cookie都一同保留在客户机上,并且一切这些Cookie城市跟着对该站点发送的哀求一同发送到服务器,也就是说,站点的每一个页面都能失掉该站点的一切Cookie。但偶然候,您大概但愿Cookie更具有针对性,这时候,您能够经由过程两种办法设置Cookie的无效局限:

  把Cookie的无效局限限定在服务器上的一个文件夹中,实践上如许就将Cookie限定到站点上的某个使用程序。

  把无效局限设置为某个域,从而同意您指定域中的哪些子域能够会见Cookie。

  将Cookie限定到某个文件夹或使用程序

  要将Cookie限定到服务器上的某个文件夹,请按以下办法设置Cookie的Path属性:

DimappCookieAsNewHttpCookie("AppCookie")
appCookie.Value="written"&Now.ToString
appCookie.Expires=Now.AddDays(1)
appCookie.Path="/Application1"
Response.Cookies.Add(appCookie)
  固然,您也能够经由过程间接设置Response.Cookies来编写Cookie,如前文所述。

  路径能够是站点根目次下的物理路径,也能够是假造根目次。如许一来,Cookie就只能用于Application1文件夹或假造根目次中的页面。比方,假如您的站点名为www.contoso.com,则后面示例中天生的Cookie就只能用于路径为http://www.contoso.com/Application1/的页面和该文件夹下的一切页面,而不合用于其他使用程序中的页面,如http://www.contoso.com/Application2/或http://www.contoso.com/下的页面。

  提醒:经由过程对InternetExplorer和Mozilla扫瞄器举行测试发明,此处利用的路径是辨别巨细写的。一样平常而言,Windows服务器上的URL不辨别巨细写,但这类情形破例。您没法把持用户怎样在扫瞄器中输出URL,可是,假如您的使用程序依附于与特定路径相干的Cookie,则请确保您所创立的一切超链接中的URL与Path属性值的巨细写相婚配。

  将Cookie的无效局限限定到域

  默许情形下,Cookie与特定的域相干联。比方,假如您的站点是www.contoso.com,那末当用户向该站点哀求页面时,您编写的Cookie就被发送到服务器。(有特定路径值的Cookie除外,我在上一节方才注释过。)假如您的站点有子域(比方contoso.com、sales.contoso.com和support.contoso.com),就能够把Cookie同特定的子域相干联。为此,必要设置Cookie的Domain属性,以下所示:

Response.Cookies("domain").Value=DateTime.Now.ToString
Response.Cookies("domain").Expires=DateTime.Now.AddDays(1)
Response.Cookies("domain").Domain="support.contoso.com"
  假如依照这类体例设置域,则Cookie只能用于指定子域中的页面。

  您也能够使用Domain属性来创立可在多个子域中共享的Cookie。比方,对域举行以下设置:

Response.Cookies("domain").Value=DateTime.Now.ToString
Response.Cookies("domain").Expires=DateTime.Now.AddDays(1)
Response.Cookies("domain").Domain="contoso.com"
  如许,该Cookie便可用于主域、sales.contoso.com和support.contoso.com。
<P>  读取Cookie

  当扫瞄器向服务器发送哀求时,该服务器的Cookie会与哀求一同发送。在ASP.NET使用程序中,您可使用Request工具来读取Cookie。Request工具的布局与Response工具的布局基础不异,以是从Request工具中读取Cookie的办法与向Response工具中写进Cookie的办法十分相似。以下示例显现了两种办法,目标都是猎取名为“username”的Cookie的值并将值显现在Label控件中:

IfNotRequest.Cookies("userName")IsNothingThen
 Label1.Text=Server.HtmlEncode(Request.Cookies("userName").Value)
EndIf

IfNotRequest.Cookies("userName")IsNothingThen
 DimaCookieAsHttpCookie=Request.Cookies("userName")
 Label1.Text=Server.HtmlEncode(aCookie.Value)
EndIf
  在猎取Cookie的值之前,应当确保该Cookie的确存在。不然,您将失掉一个System.NullReferenceException(英文)非常。还必要注重的是,在页面中显现Cookie的内容之前,我挪用了HttpServerUtility.HtmlEncode(英文)办法对Cookie的内容举行编码。之以是如许做,是由于我要显现Cookie的内容(一样平常您不会如许做)并且要确保没有任何歹意用户在Cookie中增加了可实行剧本。有关Cookie平安性的具体信息,请参阅Cookie和平安性。

  注重:因为分歧的扫瞄器保留Cookie的体例也分歧,以是统一台盘算机上的分歧扫瞄器纷歧定可以互相读取各自的Cookie。比方,假如利用InternetExplorer测试一个页面,然后再利用其他扫瞄器举行测试,那末后者就不会找到InternetExplorer保留的Cookie。固然,年夜多半人一样平常都是利用统一种扫瞄器举行Web交互的,因而在年夜多半情形下不会呈现成绩。但偶然仍是会碰到成绩,好比您要测试使用程序对扫瞄器的兼容性。

  读取Cookie中子键值的办法与设置该值的办法相似。以下是猎取子键值的一种办法:

IfNotRequest.Cookies("userInfo")IsNothingThen
 Label1.Text=Server.HtmlEncode(Request.Cookies("userInfo")("userName"))
 Label2.text=Server.HtmlEncode(Request.Cookies("userInfo")("lastVisit"))
EndIf
  在下面的示例中,我猎取的是子键“lastVist”的值,在此前的会商中我把该值设置为DateTime值的字符串暗示情势。请记着,Cookie是用字符串的情势保留值的,以是要将lastVisit值用作日期,就必需对其举行转换:

DimdtAsDateTime
dt=CDate(Request.Cookies("userInfo")("lastVisit"))
  Cookie中子键的范例是NameValueCollection(英文)范例的汇合。因而,另外一种猎取单个子键的办法是先猎取子键汇合,然后按称号提取子键的值,以下所示:

IfNotRequest.Cookies("userInfo")IsNothingThen
 DimUserInfoCookieCollectionAs_
System.Collections.Specialized.NameValueCollection
 UserInfoCookieCollection=Request.Cookies("userInfo").Values
 Label1.Text=Server.HtmlEncode(UserInfoCookieCollection("userName"))
 Label2.Text=Server.HtmlEncode(UserInfoCookieCollection("lastVisit"))
EndIf
  就像设置Cookie一样,利用哪一种办法读取Cookie也由您本人决意。

  甚么是无效期?

  您能够读取Cookie的称号和值,除此之外,必要懂得的有关Cookie的信息并非良多。固然您能够猎取Domain和Path属性,可是这些属性的用处很无限。比方,您能够读取Domain属性,但假如您的页面与Cookie不在不异的域,您基本就不会在页面的地位吸收到该Cookie。

  您没法读取的是Cookie的过时日期和工夫。现实上,当扫瞄器向服务器发送Cookie信息时,扫瞄器并未将过时信息包含在内。您能够读取Expires属性,但老是前往为零的日期/工夫值。

  在后面的编写Cookie一节中,我已讲过,是扫瞄器卖力办理Cookie的,Expires属性就很好地印证了这一点。Expires属性的次要感化是匡助扫瞄器实行有关Cookie保留的一样平常办理。从服务器的角度来看,Cookie要末存在要末不存在,以是对服务器而言,无效期并非有效的信息。以是,扫瞄器在发送Cookie时其实不供应此信息。假如您必要Cookie的过时日期,就必需从头设置,关于这一点我将在修正和删除Cookie中先容。

  更切实地说,您能够在向扫瞄器发送Cookie之前读取已在Response工具中设置的Expires属性,但您没法从前往的Request工具中猎取无效期信息。
<P>  读取Cookie汇合

  后面的示例假定您要读取称号已知的Cookie。偶然,您大概必要读取可供页面利用的一切Cookie。要读取可供页面利用的一切Cookie的称号和值,您能够使用以下代码遍历Request.Cookies汇合:

DimiAsInteger
DimoutputAsString=""
DimaCookieAsHttpCookie
Fori=0toRequest.Cookies.Count-1
 aCookie=Request.Cookies(i)
 output&="Cookie称号="&Server.HtmlEncode(aCookie.Name)&"<br>"
 output&="Cookie值="&Server.HtmlEncode(aCookie.Value)&_
&"<br><br>"
Next
Label1.Text=output
  注重:运转此代码时,您极可能会看到一个名为“ASP.NET_SessionId”的Cookie,ASP.NET用这个Cookie来保留您的会话的独一标识符。这个会话Cookie不会永世保留到您的硬盘上。有关会话Cookie的具体信息,请参阅本文前面的Cookie和会话形态。
后面的示例有一个限定:假如Cookie有子键,就会以一个独自的称号/值字符串来显现子键。Cookie的HasKeys(英文)属性能够告知您该Cookie是不是有子键。假如有子键,您能够在子键汇合中向下钻取,猎取各个子键的称号和值。

  如前文所述,您能够从Cookie属性Values(英文)中猎取有关子键的信息,该属性是范例NameValueCollection的汇合。您能够依据索引值从Values汇合中间接读取子键值。响应的子键值能够从Values汇合的成员AllKeys(英文)中失掉,该成员将前往一个字符串汇合。

  以下示例是对前一示例的修正。示例中利用HasKeys属性来测试子键,假如检测到子键,就从Values汇合中猎取子键:

DimiAsInteger
DimjAsInteger
DimoutputAsString=""
DimaCookieAsHttpCookie
DimsubkeyNameAsString
DimsubkeyValueAsString
Fori=0ToRequest.Cookies.Count-1
 aCookie=Request.Cookies(i)
 output&="称号="&aCookie.Name&"<br>"
 IfaCookie.HasKeysThen
  Forj=0ToaCookie.Values.Count-1
   subkeyName=Server.HtmlEncode(aCookie.Values.AllKeys(j))
   subkeyValue=Server.HtmlEncode(aCookie.Values(j))
   output&="子键称号="&subkeyName&"<br>"
   output&="子键值="&subkeyValue&"<br><br>"
  Next
 Else
  output&="值="&Server.HtmlEncode(aCookie.Value)&"<br><br>"
 EndIf
Next
Label1.Text=output
  您也能够把子键作为NameValueCollection工具举行提取,以下所示:

IfaCookie.HasKeysThen
DimCookieValuesAs_
System.Collections.Specialized.NameValueCollection=aCookie.Values
DimCookieValueNames()AsString=CookieValues.AllKeys
Forj=0ToCookieValues.CountC1
 subkeyName=Server.HtmlEncode(CookieValueNames(j))
 subkeyValue=Server.HtmlEncode(CookieValues(j))
 output&="子键称号="&subkeyName&"<br>"
 output&="子键值="&subkeyValue&"<br><br>"
Next
Else
 output&="值="&aCookie.Value&"<br><br>"
EndIf
  注重:请记着,我之以是挪用Server.HtmlEncode办法,只是由于我要在页面上显现Cookie的值。假如您只是测试Cookie的值,就不用在利用前对其举行编码。

  修正和删除Cookie

  偶然,您大概必要修正某个Cookie,变动其值或延伸其无效期。(请记着,因为扫瞄器不会把无效期信息传送到服务器,以是您没法读取Cookie的过时日期。)

  固然,实践上您并非间接变动Cookie。只管您能够从Request.Cookies汇合中猎取Cookie并对其举行操纵,但Cookie自己仍旧存在于用户硬盘上的某个中央。因而,修正某个Cookie实践上是指用新的值创立新的Cookie,并把该Cookie发送到扫瞄器,掩盖客户机上旧的Cookie。

  以下示例申明了怎样变动用于贮存站点会见次数的Cookie的值:

DimcounterAsInteger
IfRequest.Cookies("counter")IsNothingThen
 counter=0
Else
 counter=CInt(Request.Cookies("counter").Value)
EndIf
counter+=1
Response.Cookies("counter").Value=counter.ToString
Response.Cookies("counter").Expires=DateTime.Now.AddDays(1)
  大概:

DimctrCookieAsHttpCookie
DimcounterAsInteger
IfRequest.Cookies("counter")IsNothingThen
 ctrCookie=NewHttpCookie("counter")
Else
 ctrCookie=Request.Cookies("counter")
EndIf
counter=CInt(ctrCookie.Value)+1
ctrCookie.Value=counter.ToString
ctrCookie.Expires=DateTime.Now.AddDays(1)
Response.Cookies.Add(ctrCookie)
  删除Cookie

  删除Cookie(即把该Cookie从用户的硬盘上物理删除)是修正Cookie的一种情势。因为Cookie位于用户的盘算机中,以是您没法间接将其删除。可是,您可让扫瞄器为您删除Cookie。修正Cookie的办法后面已先容过(即用不异的称号创立一个新的Cookie),分歧的是将其无效期设置为已往的某个日期。当扫瞄器反省Cookie的无效期时,就会删除这个已过时的Cookie。

  以是,删除Cookie的办法与创立该Cookie的办法是不异的,只不外要把其无效期设置为已往的某个日期。以下示例比删除单个Cookie要略微风趣一些,它利用的办法能够删除以后域的一切Cookie:

DimiAsInteger
DimcookieNameAsString
DimlimitAsInteger=Request.Cookies.Count-1
Fori=0Tolimit
 aCookie=Request.Cookies(i)
 aCookie.Expires=DateTime.Now.AddDays(-1)
 Response.Cookies.Add(aCookie)
Next
  修正或删除子键

  修正单个子键的办法与最后创立它的办法不异:

Response.Cookies("userInfo")("lastVisit")=DateTime.Now.ToString
Response.Cookies("userInfo").Expires=DateTime.Now.AddDays(1)
  对照庞大的成绩是怎样删除单个子键。您不克不及只是复杂地从头设置Cookie的过时日期,由于如许只能删除全部Cookie而不克不及删除单个子键。实践的办理计划是对包括子键的Cookie的Values汇合举行操纵。起首,经由过程从Request.Cookies工具中猎取Cookie来从头创立Cookie。然后,您就能够挪用Values汇合的Remove办法,将要删除的子键称号传送到Remove办法。接上去,您一般能够将修正后的Cookie增加到Response.Cookies汇合,以便将修正后的Cookie发送回扫瞄器。

  以下代码显现了怎样删除子键。在示例中,要删除的子键的称号在变量中指定。

DimsubkeyNameAsString
subkeyName="userName"
DimaCookieAsHttpCookie=Request.Cookies("userInfo")
aCookie.Values.Remove(subkeyName)
aCookie.Expires=DateTime.Now.AddDays(1)
Response.Cookies.Add(aCookie)
  Cookie与平安性

  在利用Cookie时,您必需意想到其固有的平安缺点。我所指的平安性并非隐私成绩,正如我在后面的甚么是Cookie?中所述,隐私在更年夜水平上是某些用户面临的成绩:这些用户很体贴Cookie中的信息是怎样被利用的。而Cookie的平安性成绩与从客户机猎取数据的平安性成绩相似。关于初学者,就使用程序而言,Cookie是用户输出的另外一种情势,因此很简单被别人不法猎取和使用。因为Cookie保留在用户本人的盘算机上,以是用户最少能够看到您保留在Cookie中的信息。假如用户乐意,还能在扫瞄器向您发送Cookie之前修正该Cookie。

  以是,您万万不要在Cookie中保留保密信息-用户名、暗码、信誉卡号等等。在Cookie中不要保留不该该由用户把握的内容,也不要保留大概被其他夺取Cookie的人把持的内容。

  一样,要对从Cookie中失掉的任何信息都持嫌疑立场。不要以为失掉的数据就是您现在假想的信息。处置Cookie值时接纳的平安措施应当与处置Web页面顶用户键进的数据时接纳的平安措施不异。比方,在页面中显现值之前,我会对Cookie中的内容举行HTML编码。这是一种尺度的办法,能够在显现之前污染从用户处失掉的信息,对Cookie的处置与此不异。

  另外一个必要体贴的成绩是,Cookie是以纯文本的情势在扫瞄器和服务器之间传送的,任何能够截取Web通讯的人都能够读取Cookie。您能够对Cookie的属性举行设置,使其只能在利用平安套接字层(SSL,又称https://)的毗连上传输。SSL其实不能避免保留在用户盘算机上的Cookie被别人读取或操纵,但它能避免Cookie在传输途中被别人截取。本文不会商SSL,但您必需分明,您能够对Cookie举行传输回护。有关SSL的具体信息,请参阅SecureSocketsLayer:ProtectYourE-CommerceWebSitewithSSLandDigitalCertificates(英文)。

  面临这些平安成绩,怎样才干平安地利用Cookie?您能够在Cookie中保留一些不主要的数据,如用户首选项或其他对使用程序没有严重影响的信息。假如的确必要把某些敏感信息(如用户ID)保留在Cookie中,就对这些信息举行加密。一种可行的办法是使用ASP.NETFormsAuthentication有用程序创立一个身份考证单子,作为Cookie保留。本文不会商有关加密的成绩,可是,假如您必要在Cookie中保留敏感信息,就应当试着接纳措施来埋没信息,避免被别人盗用。

  在MitigatingCross-siteScriptingWithHTTP-onlyCookies(英文)一文中,您能够懂得到更多有关Cookie及其平安缺点的信息。

  反省扫瞄器是不是承受Cookie

  我在后面的Cookie的限定一节中已经提到一个潜伏成绩,即用户能够设置本人的扫瞄器回绝承受Cookie。怎样才干晓得您是不是能够读写Cookie?在不克不及写进Cookie时不会呈现任何毛病(比方Response.Cookies不会抛出非常),由于服务器其实不跟踪出现页面后呈现的情形。扫瞄器一样不会向服务器发送任何有关其以后的Cookie设置的信息。(大概您必要懂得,但HttpBrowserCapabilities.CookiesProperty[英文]属性其实不会告知您Cookie是不是被启用,而只能告知您以后的扫瞄器是不是撑持Cookie。)

  一种断定扫瞄器是不是承受Cookie的办法是先编写一个Cookie,然后再实验读取这个Cookie。假如不克不及读取这个Cookie,则能够以为该扫瞄器不承受Cookie。

  我编写了一个复杂的示例来讲明怎样测试Cookie是不是被承受。该示例包括两个页面。在第一个页面中,我编写了一个Cookie,然后把扫瞄重视新定向到第二个页面。第二个页面实验读取这个Cookie,转而将扫瞄重视新定向到第一个页面,并向URL增加一个带有测试了局的查询字符串变量。

  第一个页面的代码以下:

SubPage_Load()
IfNotPage.IsPostBackThen
 IfRequest.QueryString("AcceptsCookies")IsNothingThen
  Response.Cookies("TestCookie").Value="ok"
  Response.Cookies("TestCookie").Expires=DateTime.Now.AddMinutes(1)
  Response.Redirect("TestForCookies.aspx?redirect="Server.UrlEncode(Request.Url.ToString))
 Else
  labelAcceptsCookies.Text="承受Cookie="Request.QueryString("AcceptsCookies")
 EndIf
EndIf
EndSub
  第一个页面测试是不是有复书,假如没有,就搜刮包括测试了局的查询字符串变量(AcceptsCookies)。假如没有找到查询字符串变量,则暗示测试还没有完成,代码就写出一个名为“TestCookie”的Cookie。写出Cookie以后,示例挪用Response.Redirect来切换到测试页面(TestForCookies.aspx)。附加到测试页面的URL的是名为redirect的查询字符串变量,该变量中包括了以后页面的URL,如许就可以在实行测试后把重定向到该页面。

  测试页面能够完整由代码构成,不必要包括控件。以下就是我利用的代码:

SubPage_Load()
 DimredirectAsString=Request.QueryString("redirect")
 DimacceptsCookiesAsString
 是不是承受Cookie?
 IfRequest.Cookies("TestCookie")IsNothingThen
  没有Cookie,因而不必要承受
  acceptsCookies=0
 Else
  acceptsCookies=1
  删除测试Cookie
  Response.Cookies("TestCookie").Expires=DateTime.Now.AddDays(-1)
 EndIf
 Response.Redirect(redirect&"?AcceptsCookies="&acceptsCookies,True)
EndSub
  读取redirect查询字符串变量后,代码就实验读取Cookie。为了完成一样平常办理,假如该Cookie的确存在,就会被当即删除。测试完成后,代码从redirect查询字符串变量传送的URL机关一个新的URL。新的URL也包含一个包括测试了局的查询字符串变量。最初一步是利用新的URL将扫瞄重视定向到本来的页面。

  这个示例非常复杂,但申明了经由过程运转程序并检察了局来举行测试的基础准绳。个中最必要改善的中央是要永世保留Cookie测试了局,如许用户就不用在每次扫瞄原始页面时都反复举行测试。可是,实践上其实不能做到这一点。Cookie不会起感化,缘故原由是不言而喻的。另外一种多是把测试了局保留在会话形态中,但在默许情形下,会话形态也依附于Cookie,而假如扫瞄器不承受Cookie,会话形态也不会起感化。办理后一个成绩的举措是接纳无Cookie的会话形态。下一节我将扼要先容会话形态怎样与Cookie合作。

  Cookie和会话形态

  当用户会见您的站点时,服务器会为该用户创立独一的会话,会话将一向持续到用户会见停止。关于每一个会话,ASP.NET都保护一种基于服务器的布局(会话形态),在该布局中使用程序能够保留用户的相干信息。有关具体信息,请参阅SessionState(英文)。

  ASP.NET必要能跟踪每一个用户的会话ID,如许才干把用户映照到服务器上的会话形态信息。默许情形下,ASP.NET利用一个非永世性的Cookie来保留会话形态。假如您利用读取Cookie一节的“读取Cookie汇合”中的示例,您大概就会在Cookie中发明一个会话形态Cookie。

  可是假如用户禁用了扫瞄器的Cookie,会话形态就不克不及利用Cookie来保留会话ID,会话形态也不会起感化。这就是为何我在后面的反省扫瞄器是不是承受Cookie中说,没法在Cookie测试终了后把测试了局实践保留在会话形态中,由于没有Cookie就没有会话形态。

  ASP.NET供应了一种办理计划,即使用无Cookie的会话。您能够设置本人的使用程序,不在Cookie中保留会话ID,而是在站点页面的URL中保留。会话ID保留在URL中,也就是ASP.NET将ID保留在扫瞄器中,从而可以在用户哀求其他页面时取回ID。

  无Cookie会话能够制止扫瞄器回绝Cookie的成绩,使您可以利用会话形态。假如您的使用程序依附于会话形态,您大概就必要对其举行设置,使它能利用无Cookie会话。可是,在某些情形下,假如用户与其别人共享URL-多是用户经由过程电子邮件将URL发送给同事,而该用户的会话仍旧处于激活形态-那末终极这两个用户大概共享统一个会话,了局将难以意料。我觉得很重要,一般所说的不重要应该指的是:你学好一种以后再学另一种就很容易了。(因为这样大家可能有一个错觉就是语言不是很重要,只要随便学一种就可以了,其实不是这样的。

小女巫 发表于 2015-1-19 17:51:12

弱类型造成潜在的出错可能:尽管弱数据类型的编程语言使用起来回方便一些,但相对于它所造成的出错几率是远远得不偿失的。

透明 发表于 2015-1-25 12:42:09

微软又推出ASP.NET。这不是ASP的简单升级,而是全新一代的动态网页实现系统,用于一台WEB服务器建立强大的应用程序。是微软发展的新体系结构.NET的一部分,是ASP和.NET技术的结合。

爱飞 发表于 2015-2-2 22:06:36

使用普通的文本编辑器编写,如记事本就可以完成。由脚本在服务器上而不是客户端运行,ASP所使用的脚本语言都在服务端上运行,用户端的浏览器不需要提供任何别的支持,这样大提高了用户与服务器之间的交互的速度。

分手快乐 发表于 2015-2-8 11:29:17

弱类型造成潜在的出错可能:尽管弱数据类型的编程语言使用起来回方便一些,但相对于它所造成的出错几率是远远得不偿失的。

愤怒的大鸟 发表于 2015-2-25 11:04:24

但是目前在CGI中使用的最为广泛的是Perl语言。所以,狭义上所指的CGI程序一般都是指Perl程序,一般CGI程序的后缀都是.pl或者.cgi。

老尸 发表于 2015-3-7 20:14:03

由于JSP/Servlet都是基于Java的,所以它们也有Java语言的最大优点——平台无关性,也就是所谓的“一次编写,随处运行(WORA–WriteOnce,RunAnywhere)”。除了这个优点,JSP/Servlet的效率以及安全性也是相当惊人的。

若相依 发表于 2015-3-15 13:41:38

主流网站开发语言之PHP:PHP的全名非常有趣,它是一个巢状的缩写名称——“PHP:HypertextPreprocessor”,打开缩写还是缩写。PHP是一种HTML内嵌式的语言(就像上面讲的ASP那样)。而PHP独特的语法混合了C,Java,Perl以及PHP式的新语法。它可以比CGI或者Perl更快速地执行动态网页。

变相怪杰 发表于 2015-3-22 01:17:27

目前在微软的.net战略中新推出的ASP.net借鉴了Java技术的优点,使用CSharp(C#)语言作为ASP.net的推荐语言,同时改进了以前ASP的安全性差等缺点。但是,使用ASP/ASP.net仍有一定的局限性,因为从某种角度来说它们只能在微软的WindowsNT/2000/XP+IIS的服务器平台上良好运行(虽然像ChilliSoft提供了在UNIX/Linux上运行ASP的解决方案.
页: [1]
查看完整版本: ASP.NET网页编程之揭开ASP.NET中Cookie编程的奥妙