网站首页 | 范文大全 | 常用申请书 | 党团范文 | 讲话发言 | 作文大全 | 报告叙述 | 合同范文 | 党建教育 | 入党材料 | 心得体会 |
三晋范文网
  • 政府政务
  • 分析材料
  • 党委党建
  • 民主生活
  • 先进性教育
  • 保先教育
  • 您的位置:三晋范文网 > 党建教育 > 政府政务 > 正文 2019-10-14 07:36:07

    [ASP3.0高级编程(三)]高级编程

    访问和更新Cookies集合

    Cookies的值比ASP其他集合(例如Form和ServerVariables)的值要复杂得多。Cookie是一小块由浏览器存贮在客户端系统上的文本,且随同每次请求发往它们应用于的域中的服务器。

    ASP使得应用cookie较为容易,可以从Request对象的Cookies集合中获得所有随同请求发出的cookie值,并可创建或修改cookie,通过Response对象的Cookies集合发回给用户。

    Cookie包含可用两种方式构造的信息,单值cookie提供其值给代码是通过一个一般的类ASP集合。然而,集合的每个成员可能本身也是一个集合,包含这种信息的cookie通过称为多值(multiple-Value)cookie。

    创建一个单值的cookie较为简单,如下所示:

    Response.Cookies(“item-name”)=“item-value”

    创建一个多值的cookie,可以使用如下命令:

    Response.Cookies(“item-name”)(“sub-item-name”)=“sub-item-value”

    设置cookie应用的域及路径及其有效期,我们使用:

    Response.Cookies(“item-name”).domain=“domain-url”

    Response.Cookies(“item-name”).path=“virtual-path”

    Response.Cookies(“item-name”).expires=#date#

    通常,客户只在对创建cookie的目录中的页面提出请求时,才将cookie随请示发住服务器。通过指定path属性,可以指定站点中何处这个cookie是合法的,并且这个cookie将随请求发送。如果cookie随对整个站点的页面请求发送,设置path为“/”。

    假如Expires属性没有设置,关闭当前的浏览器实例时,cookie将被自动消除。

    注意,我们在向浏览器发送任何输出时,已经创建了cookie。因为,这些cookie是页面HTTP报头的一部分。

    在ASP3.0中,缓冲的缺省状态是打开的,且没有输出被发送,除非使用Response.Flush指定做这个工作或者页面已到末端。这意味着创建cookie的代码可以在页面上的任何位置,直到任何输出“刷新”(flush)到客户端前,它都可以被执行。

    要读现有的cookie,使用Request.Cookies集合。可以单独访问其中的项目,方法类似于创建它们时使用的方法。

    StrSingleValue=Request.Cookies(“item-name”)

    StrSubItemValue=Request.Cookies(“item-name”)(“sub-item-name”)

    注意Request.Cookies集合(和所有其他Request集合一样)是只读的。Response.Cookies集合是只写的,事实上可以访问这个集合中一系列cookie的名称,而不是它们的值。

    遍历Cookies集合

    为了使用Cookies集合更加方便,可使用名称为Haskeys的附加属性。假如访问的cookie本身也是个集合,即它是一个多值的cookie,这将返回True。使用Haskeys属性,可以遍历完整的Request.Cookies集合,从而获得所有cookie的列表及它们的值。

    ForEachobjItemInRequest.Cookies

    IfRequest.Cookies(objItem).HasKeyThen

    ‘UseanotherForEachtoiterateallsubkeys

    ForEachobjItemKeyinRequest.Cookies(objItem)

    Response.WriteobjItem&“(“&objItemKey&“)=“_

    &Request.Cookies(objItem)(objItemKey)&“<p”

    Next

    Else

    ‘Printoutthecookiestringasnormal

    Response.WriteobjItem&“=”&Request.Cookies(objItem)&“<p”

    EndIf

    Next

    这非常类似于前面的从Request.Form集合中提取多个值的复杂代码。但是这里可以使用Haskeys属性来判别每个条目是否为一个集合。而在Form例子里,必须查询Request.Form(item_name).Count属性,这是因为Form集合(和所有的除cookie外的其他集合)成员不可能是真正的集合。ASP只是做了“幕后”的工作,得到了每个多条目集合的值。

    Form和QueryString的差异

    了解了访问各种ASP集合的技术以后,需要解决另一个问题是:Form和QueryString集合之间的差异是什么?假如准备使用ASP,毫无疑问应该清楚这种差异,但需要参考HTTP工作方式来重新认识,理解它们。

    通过HTTP从Web服务器请求页面或其他资源,有两个通用的方法。可使用GET方法直接获得资源,也可使用POST把值传给相应资源。GET方法是缺省的,可以看一下本章前面的一个HTTP请求的实例:

    7/8/9910:27:16SentGET/Store/Download.aspHTTP/1.1

    假如把一个或多个成对的名称/值附在请求页面的URL后,就变成请求的查询字符串,且在QueryString集合中提供给ASP页面。单击Web页面、Email消息或其它文档的超链接,或在浏览器的地址栏中输入地址并按回车,或单击浏览器中的Links或Favorites按钮,所有这些都要使用GET方法。

    因此,对这些动作中传递值给ASP的唯一方法是通过QueryString集合,把值附在URL后。

    出现在Request.QueryString集合中并被访问的值,与前面看到的Form集合实例中的工作方式相同。URL和查询字符串的结合:

    http://mysite.com/process_page.asp?FirstName=Priscilla&LastName=Descartes

    可以采用如下方式访问在QueryString集合中提供的值:

    strFirstName=Request.QueryString(“FirstName”)‘Return“Priscilla”

    strLastName=Request.QueryString(“LastName”)‘Return“Descartes”

    strRaw=Request.QueryString

    ‘Return“FirstName=Priscilla&LastName=Descartes”

    窗体的GET和POST方法

    在一个页面内使用<FORM段时,可以设置打开的FORM标记的METHOD属性值为“GET”或“POST”,缺省值为“GET”。假如使用“GET”或省略其属性,浏览器将该值绑定在页面所有控件上,成为一个查询字符串,且附在被请求页面的URL上。

    当这个请求到达Web服务器时,其值由ASP的Request.QueryString集合提供。然而,假如设置METHOD属性为“POST”,浏览器将值包装进发送服务器的HTTP报头中,通过Request.Form集合提供给ASP。

    通过来说,可以在所有的HTML窗体中使用POST方法。然而,浏览器或服务器的URL字符串长度存在一定的限制。因此,附有长的字符串可能会引起溢出和某些字符串的字符被截掉。同时,查询字符串出现在浏览器的地址栏和所有的保存的链接和收藏夹中。不仅如此,还显露了通过Web服务器时在HTTP请求中不想显示的值,它也可能出现你的服务器和其他路由服务器的日志文件中。在HTTP请求报头中的值很少是可见的,并且不出现在日志文件中。

    使用POST方法需要注意的小问题是,当用户重新下载<FORM时,窗体的值将不再保留,其值为空且必须重新输入。然而,当附在URL上时,其值被存储为一个链接,将被保留,因此将出现在所有的URL与字符串结合的请求中,这或许是个优点也可能是个缺点,这根据应用而定(一些浏览器在客户端上能够在一定范围内自动保留一个页面上的值)。

    另一点是URL与查询字符串的结合体不能包含任何空格或其他非法字符,否则的话,Navigator和一些其他的浏览器将出现问题。非法字符是那些用来分隔URL和查询字符串的部分,例如“/”、“:”、“?”和“&”(IE能够自动将空格转换为正确的格式——加号“+”,但其他的非法字符不能处理)。ASP服务器对象提供URLEncode方法处理这种变换,以后章节讨论相关内容。

    查看Request和Response对象内容

    到目前,主要讨论了一些理论问题,没有列举特别的实例。因为已经讨论过的内容多数情况下互相之间是密切相关的。然而本书为这一章提供了一系列的实例页面,说明Request和Response对象的大多数属性。应用所讲过的实例,能够理解这些页面,并可进行相应的修改,用它们作为试验实例。

    本章及其他所有章节的代码样例均提供给用户,可以从Wrox出版社站点下载。

    http://webdev.wrox.co.uk/books/2610

    http://www.wrox.com/Store/Details.asp?Code=2610

    必须首先在Web服务器的WWWRoot内的子目录下安装实例,然后使用浏览器访问Chapter02子目录,使用:

    http://your_server_name_or_IP/subdirectory_name/Chapter02/Default.asp

    这里your_server_name_or_IP/subdirectory_name是安装下载文件的本地路径。

    1、查看Request对象成员

    这提供一个包含选页的菜单用来试验Request和Response对象,首先选择UsingtheRequestObject,如下图所示:

    下图显示一个HTML窗体的实例,包含一些预先设置好的值,可以按自己的想法编辑这些值,然后点击“Submit”按钮。

    这将打开一个页面,如下图所示,显示集合和TotalBytes属性的全部内容。第一屏显示的是Form、QueryString和Cookies集合。

    注意,假如在窗体页中编辑了HTML控件的值,对于Cookies集合以及其他的集合,在读者的计算机上的页面上可能显示不同的值。

    可以从“FormCollection”段中看到窗体上的HTML控件的值如何在ASP的Request.Form集合中表示。也可以用原始的<FORM页(名称为request_form.asp)来试验和检测,以了解创建窗体的HTML和如何与相应值相联系。

    这个页面后面是ClientCertificate集合。这里是空的,因为服务器不要求客户端提供证书。下面是的ServerVariables集合,下图的屏幕图显示的是集合中包含的有用的值。

    在本书的后面附录中可以找到所有ServerVariables集合成员的一个列表,及其值的说明。然而,可从前面讨论的在请求页面时从客户端发出的HTTP报头中见到这些成员。当请求收到后,Web服务器也增加它本身的一些值到集合中,正如上面可以看到的运行在IIS5.0创建的页面那样。

    1)页面是如何工作的

    为了创建这个页面,使用了本章前面在对Form集合和如何访问其值的讨论中所看到的完全相同的代码。例如,遍历所有的集合(除Request.Cookies外),使用:

    ForEachobjItemInRequest.collection_name

    Response.WriteobjItem&“=“&Request.collection_name(objItem)&“<p”

    Next

    遍历Cookies集合,可以使用:

    ForEachobjItemInRequest.Cookies

    IfRequest.Cookies(objItem).HasKeysThen

    ‘UseanotherFor...Eachtoiterateallkeysofdictionary

    ForEachobjItemKeyinRequest.Cookies(objItem)

    Resonse.WriteobjItemobjItem&“(“&objItemKey&“)=“_

    &Request.Cookies(objItem)(objItemKey)&“<p”

    Next

    Else

    ‘Printoutthecookiestringasnormal

    Response.WriteobjItem&“=“&Request.Cookies(objItem)&“<p”

    EndIf

    Next

    为获得TotalBytes属性,可简单地使用:

    Request.TotalBytes=<%=Request.TotalBytes%<P

    读者应该注意到,在两个集合中出现的某些值不是从窗体的HTML控件中直接得到的。QueryString集合包括了两个名为chapter和sample的值,如下图所示:

    为在请求中创建这两个值,将一个字符串附在窗体的ACTION属性的URL上,这是可以接受的。工作方式与附在一个<A元素的HREF属性上相类似。查询字符的值出现在QueryString集合中,且被POST的窗体控件值出现在Form集合中。

    <FORMACTION=”show_request.asp?chapter=2&sample=The+Request+Object”METHOD=”POST”

    为防止非IE类的浏览器出现错误,必须将查询字符串中的空格用加号“+”来代替,读者将在第4章的Server对象的URLEncode方法中看到更多这种情况。

    2)创建客户端的cookie

    为了确保至少有些值出现在Request.Cookies集合中,增加一些客户端脚本代码到原始的<FORM页面request_form.asp。将创建名称为VisitCount的多值cookie。另一个cookie是由另一个页面创建的,且已经存在于浏览器中。如下图所示,读者可以看到另外的cookie。

    这是一段窗体被装载时设置文档对象的cookies属性的客户端代码:

    <SCRIPTLANGUAGE=”JavaScript”

    <!--

    documet.cookie=’VisitCount=VISITS=3&LASTDATE=6%2F4%2F99+10%3A10%3A13+AM’;

    //--

    </SCRIPT

    另外,必须将内容进行编码,以便它能被正确地传送到服务器(同样的规则也适用于将查询字符串附到URL上)。在第4章中,讨论Server对象的URLEncode方法时,读者将了解到更多细节。

    2、查看Response对象的成员

    回到Chapter02实例的最初的Default.asp页面,这次选择“UsingtheResponseObject”链接,这个页面显示的是Response对象的集合和属性的内容,且提供到所有Response对象方法的链接。

    下图是使用浏览器NetsapeCommunicator4.61的屏幕,用来证明使用的是纯服务器端和跨平台兼容技术。需要注意的是Cookies集合是为Response对象而建立的,仅显示cookie的名称而不显示其值。浏览该页时,可能得不到cookie或得到与这个页面不同的cookie。

    (由于豆豆没有安装NetsapeCommunicator4.61,仍用IE5.5显示,并无什么区别)

    各种Response属性说明了将要用来创建HTTP报头的一些信息。HTTP报头页面的其他部分(HTML和文本内容)被发往到客户端。这些属性中的一些以及所有的Response对象的方法均有链接,允许读者打开另一个页面来显示其使用情况。我们稍后再回到这些页面。

    页面中的属性是通过读取相应的属性并插入到页面中创建的。由于这些是动态链接,通过<A元素来选择。

    <AHREF=”headers/expiretet_form.asp”Response.CacheControl</A

    =<%=Resposne.CacheControl%<p

    链接到每个方法是通过<A链接元素,页面中唯一复杂的部分是Response.Cookies集合。通过只能访问cookie,读取Request.Cookies集合中的值。当访问Response.Cookie集合时,必须在发送任何输出到客户端之前结束对它的所有引用。因此在页面的上部,通过遍历集合创建页面的HTML放在一个局部字符串变量中。

    StrCookies=“”

    ‘Wecanonlyreadthekeynamesandnotthevaluesbecause

    ‘theResponse.Cookiescollectionis‘writeonly’

    ForEachobjItemInResponse.Cookies

    IfResponse.Cookies(objItem).HasKeysThen

    ‘UseanotherForEachtoiterateallsubkeys

    ForEachobjItemKeyinResponse.Cookies(objItem)

    StrCookies=strCookies&objItem&“(“&objItemKey&“)<p”

    Next

    Else

    ‘printoutthecookieasnormal

    strCookies=strCookies&objItem&“<p”

    EndIf

    Next

    然后在页面的适当点上插入结果。

    <P<DIVCLASS=”subhead”TheResponse.CookiesCollection</DIV

    <I<AHREF=”cookies/setcookies.asp”Response.Cookies</A

    isawrite-onlycollectionsothevaluescannotbedisplayed</I<p

    <%=strCookies%

    ASP中的cookie的使用

    在前面所看到页面中,一些集合、属性和方法已经链接到其他的页面,用来显示Request和Response对象的各个特性细节,我们将在本章的其余的部分研究这些内容,我们将学习那些提供给ASP代码使用的集合、方法和属性的各种技术。

    在本章前面已经看到了如何使用Request.Cookies和Response.Cookies集合来创建和阅读cookie,点击上面两个页面中的任一个的“Cookies”链接时,这个页面包含一些设置了三个cookie的值的ASP代码,且在页面上显示被执行的代码,如下图所示:

    点击“ShowCookies”的链接时,cookie的内容就显示出来了。这是通过遍历Request.Cookies集合而得到的,这与在上一页所用的方式完全相同,如下图所示:

    这个屏幕图显示的是运行前面看到的设置cookie值的代码的结果。可能会看到其他已经存贮在计算机系统里的cookie。然而,假如现在关闭浏览器然后重新打开浏览器,然后运行显示cookie的页面,除了TimedCookie外,所有的cookie都不见了,这是由于只有这个TimedCookie具有有效期的设置,其他的在浏览器关闭时,自动消失了。

    1)cookie中存储用户的细节情况

    可以使用cookie来存储这两类值:当浏览器关闭时我们不想保存的值(例如用户的注册信息)以及在用户访问站点时要保留的值。在每种情况下cookie的值对于来自用户浏览器的每个页面请求的ASP都是可用的。

    然而,需要记住的是,cookie只有在对Cookie中的虚拟路径(path)内的页面发出请求时,才会发往服务器。缺省时,假如path的值在cookie中没有设置,则其值为创建cookie的页面的虚拟路径。为使一个cookie发往一个站点的所有页面,需要使用path=“/”。

    这里是个实例,从自定义的Login页面中,将用户的注册信息存贮在一个cookie中,由于没有应用有效期,cookie值仅在关闭这个浏览器这前保留:

    ...

    Request.Cookies(“User”)(“UID”)=“<%=Request(“UserName”)%”

    Request.Cookies(“User”)(“PWD”)=“<%=Request(“Password”)%”

    Request.Cookies(“User”).Path=“/adminstuff”‘Onlyappliestoadminpages

    ...

    现在,在用户从adminstuff目录或其子目录请求的每个页面中,都可以找到这个cookie。假如它不存在,可以将用户重定向到注册页面:

    If(Request.Cookies(“User”)(“UID”)<“alexhomer”)_

    Or(Request.Cookies(“User”)(“PWD”)<“secret”)Then

    Response.Redirect“login.asp?UserName=”&Request.Cookies(“User”)(“UID”)

    EndIf

    ...

    由于把cookie中的用户名放在Response.Redirect的URL查询字符串中,假如在口令输入时出现错误且希望用户不必重新键入用户名,可以在login.asp页面中使用它:

    <FORMACTION=”check_user.asp”METHOD=”POST”

    <INPUTTYPE=”TEXT”NAME=”UserName”

    VALUE=”<%=Request.QueryString(“UserName”)%”<P

    <INPUTTYPE=”SUBMIT”VALUE=”LOGIN”

    </FORM

    2)修改现有的cookie

    可以使用ASP修改现有的cookie,但不能只修改cookie中的一个值。当更新一个在Response.Cookies集合中的Cookie时,现有的值将丢失。我们可以用如下代码创建一个cookie,可以使用:

    Response.Cookies(“VisitCount”)(“StartDate”)=dtmStart

    Response.Cookies(“VisitCount”)(“LastDate”)=Now

    Response.Cookies(“VisitCount”)(“Visits”)=CStr(intVisits)

    Response.Cookies(“VisitCount”).Path=“/”‘Applytoentiresite

    Response.Cookies(“VisitCount”).Expires=DateAdd(“m”,3,Now)

    假如想要更新Visits和LastDate的值,必须先不需改变的所有值,然后重写整个的cookie:

    datDtart=Response.Cookies(“VisitCount”)(“StartDate”)

    intVisits=Response.Cookies(“VisitCount”)(“Visits”)

    Response.Cookies(“VisitCount”)(“StartDate”)=dtmStart

    Response.Cookies(“VisitCount”)(“LastDate”)=Now

    Response.Cookies(“VisitCount”)(“Visits”)=Cstr(intVisits)

    Response.Cookies(“VisitCount”).Path=“/”

    Response.Cookies(“VisitCount”).Expires=DateADD(“m”,3,Now+1)且对于几乎所有的其他Response方法和属性,应该在写入任何内容(即打开<HTML标记或任何文本或其他的HTML)到响应之前完成这个工作。

    [ASP3.0高级编程(三)]高级编程》由(三晋范文网)整理提供,版权归原作者、原出处所有。
    Copyright © 2023 三晋范文网 All Rights Reserved. 备案号:京ICP备14001712号-1