下载第 2章 请求和响应的处理上一章介绍了安装设置的一些基本问题和 A S P的使用,以及其所提供的内置对象。本章将进一步研究两个最常用的对象。在浏览器 (或其他用户代理 )和 We b服务器之间,请求与响应中发生的信息交流可以通过 A S P中的两个内置对象来进行访问和管理,这两个对象称为
R e q u e s t和 R e s p o n s e对象。
在 A S P页中所要进行的工作几乎都要访问这两个对象,使用这两个对象的方式将影响页面的效率及可靠性。当然,它们的主要用途是访问用户发回到服务器的值,即从 H T M L页的
< F O R M >段获得或附在 U R L后面作为查询字符串,并创建合适的输出返回给用户,且它们可以共享很多相同的因素。例如两个对象都可以使用存储在客户端计算机上的 c o o k i e。
因此,我们把本章分成两个独立的部分 (每个对象一部分 ),并且首先从客户端与服务器之间的信息交流入手,然后再研究每一个对象。这将更有助于理解它们之间的关系及其重要性。
因此,本章研究的内容是:
客户端与服务器如何交流以传递 We b页或其他资源。
Request和 R e s p o n s e对象的细节,以及它们之间的共同点。
如何通过一个窗体和查询字符串访问相应的值。
如何读入或创建 c o o k i e并存放在客户端的计算机上。
服务器的变量是什么?如何访问和修改 H T T P报头。
说明其他相关条目的变化,如客户的证书使用。
首先看一下客户浏览器 (或“用户代理” )和 ASP 的 We b服务器之间交流的情况。
2.1 客户端和服务器的交流当浏览器或其他的用户代理访问 We b站点请求页面时,在客户服务器和 We b服务器之间就产生了一个对话,我们将仔细研究这个问题,因为理解这个问题有助于掌握使用 A S P的
R e q u e s t和 R e s p o n s e对象的基本知识,进而才能进一步掌握 A S P的更多知识。
为节省篇幅,在本章及本书后面的内容中使用“浏览器” ( b r o w s e r )一词。但需要记住的是,能够访问 We b页面的应用程序绝不仅只有浏览器,有许多特殊的应用程序从站点上下载网页,如为那些视力有缺陷用户设计的特殊的客户端程序或者是用通常的浏览器有其他困难的人。最显而易见的例子是搜索引擎用来访问 We b上的站点的 r o b o t。全面考虑这些因素,包括普通的 We b浏览器,准确的词汇应该是用户代理 (user agent)。
页面请求的对话当一个浏览器向 We b站点提出页面请求时,显然必须告诉服务器,其请求的是哪一个页面。首先要做的是通过域名与服务器建立连接,然后提供所请求页面的全路径和名称。为什么要全路径和名称? We b是一个无国界的环境,所以必须创造一个会话标识每个客户 (将在下一章介绍 A S P如何做到这点 )。
这就意味着每当服务器完成向客户发送页面后,服务器就彻底忘记了这个客户。因此,
当客户请求下一个页面时,与一个新的访问者是完全相同的。服务器无法记住这个客户,相应的,也就无法判断它们上次请求的页面是哪一个。因此,不能使用相对路径来提供一个页面,即使页面包含一个相对的链接也不行,例如:
浏览器将自动建立完整的新页面的 U R L,方法是使用当前页的域和路径;或使用页面
< H E A D >段中的 < B A S E >元素,告诉浏览器一个页面中所有链接的基 U R L是什么。例如:
当把鼠标指向一个页面的链接时,可在浏览器的状态栏中看到如图 2 - 1所示的情况。当前页面的路径和当前域名或基域名已经与请求的页面名结合在一起了。
1,客户请求的细节所请求页面的全路径和名称的组合是浏览器请求页面时发往服务器的唯一信息。浏览器的请求也能包含浏览器宿主的信息和客户端运行的操作系统。实际的信息内容将随着浏览器的不同而有相应的变化,只有很少一部分能够由其他的应用程序如搜索引擎 r o b o t提供。为了更清楚地了解该信息,下面是从 IE 5.0发出的一个对页面 h t t p,/ / w w w,w r o x,c o m / S t o r e /
D o w n l o a d,a s p的请求信息:
从中可以看出,这些信息中有关于用户代理和用户连接的细节 (如缺省的语言 ),也有能够接受的文件或应用程序的类型列表,这些都是 M I M E类型的,在后面将会见到更多。浏览器能够接受几种图像文件及多种 Microsoft Off i c e文件类型。,标准”的文件类型,如 t e x t / h t m l和
t e x t / t e x t没有列在其中。文件列表中 * / *表示可向浏览器发回任何类型的文件,由浏览器解释或通过一个插件 ( p l u g - i n )应用程序来进行解释。
c o o k i e:条目包含的 c o o k i e存放在客户端的计算机上,并仅对该域有效。假如请求是点击链接的结果,而不是在浏览器的地址栏直接输入 U R L,则 R e f e r e r:条目被显示,它包含了链接页面的完整的 U R L。
H o s t:条目包含客户计算机的 I P地址或名称。然而,这还不足以准确辨别客户机。
因为它们通过 I S P连接时,I P地址是动态分配的,或者通过一个代理服务器连接时,
I P地址是代理机的而不是实际的客户机的。
2,服务器响应的细节信息为响应上述的请求,并对匿名的浏览器 (即用户不必提供用户名和访问口令 )提供请求的页
34计计 ASP 3 高级编程 下载图 2-1 状态栏中显示的当前页面路径面,下面的内容是从服务器发往客户机的:
可以看出服务器向客户端说明自己所用的软件及版本,第一行表明所使用的是 H T T P协议,
及返回码的状态。信息,200 OK”表示请求被接受并得到了满足。后面的信息是被返回的页面的细节,包括 M I M E类型 ( C o n t e n t - L e n g t h,)、大小 (字节 )、最近更改的时间,和返回客户端存储的 c o o k i e。响应中的其他信息是页面内容的信息流。
在某些情况下,服务器响应一个请求后,不能返回一个页面,也许因为页面不存在,或者客户没有相应权限来访问它。我们将在本书后续章节讨论安全问题。现在,对于请求页面不存在的情况 (例如用户在浏览器的地址栏输入了错误的 U R L ),返回的信息开头为:
这里,状态码和信息表明客户请求的页面无法找到。浏览器可使用这个信息向用户显示相应的信息 (这种情况在 IE 5.0中不显示服务器的响应信息,而显示相应“帮助性”的错误提示页面 ),也可显示服务器创建的缺省页面 (依赖于服务器的设置 )。
至此,我们已经看到了客户机与服务器交互作用中的一些细节,下面介绍 A S P对象
R e q u e s t和 R e s p o n s e如何把这些转换成相应的值。
2.2 Request和 R e s p o n s e对象在 A S P中能够应用客户请求和服务器响应的细节是通过 A S P内置的 R e q u e s t和 R e s p o n s e对象来实现的。
R e q u e s t对象:为脚本提供了当客户端请求一个页面或者传递一个窗体时,客户端提供的全部信息。这包括能指明浏览器和用户的 H T T P变量,在这个域名下存放在浏览器中的 c o o k i e,任何作为查询字符串而附于 U R L后面的字符串或页面的 < F O R M >段中的
H T M L控件的值。 也提供使用 Secure Socket Layer (SSL)或其他加密通信协议的授权访问,
及有助于对连接进行管理的属性。
R e s p o n s e对象:用来访问服务器端所创建的并发回到客户端的响应信息。为脚本提供
H T T P变量,指明服务器和服务器的功能和关于发回浏览器的内容的信息以及任何将为这个域而存放在浏览器里新的 c o o k i e。它也提供了一系列的方法用来创建输出,例如无处不在的 R e s p o n s e,Wr i t e方法。
在这一节中,首先概述 R e q u e s t和 R e s p o n s e对象的成员,然后继续探讨如何使用它们完成创建任务,以及如何使用每个对象的成员的细节。
2.2.1 Request对象成员的概述本节将给出 R e q u e s t对象的所有成员的主要说明。
第 2章 请求和响应的处理 计计 35下载
1,Request对象的集合
R e q u e s t对象提供了 5个集合,可以用来访问客户端对 We b服务器请求的各类信息,这些集合如表 2 - 1所示。
表 2-1 Request对象的集合及说明集合名称 说 明
C l i e n t C e r t i f i c a t e 当客户端访问一个页面或其他资源时,用来向服务器表明身份的客户证书的所有字段或条目的数值集合,每个成员均是只读
C o o k i e s 根据用户的请求,用户系统发出的所有 c o o k i e的值的集合,这些 C o o k i e仅对相应的域有效,每个成员均为只读
F o r m M E T H O D的属性值为 P O S T时,所有作为请求提交的 < F O R M >段中的 H T M L控件单元的值的集合,每个成员均为只读
Q u e r y S t r i n g 依附于用户请求的 U R L后面的名称/数值对或者作为请求提交的且 M E T H O D
属性值为 G E T (或者省略其属性 )的,或 < F O R M >中所有 H T M L控件单元的值,每个成员均为只读
S e r v e r Va r i a b l e s 随同客户端请求发出的 HTTP 报头值,以及 We b服务器的几种环境变量的值的集合,每个成员均为只读
2,Request对象的属性
R e q u e s t对象唯一的属性及说明如表 2 - 2所示,它提供关于用户请求的字节数量的信息,它很少用于 A S P页,我们通常关注指定值而不是整个请求字符串。
表 2-2 Request对象的属性及说明属 性 说 明
To t a l B y t e s 只读,返回由客户端发出的请求的整个字节数量
3,Request对象的方法
R e q u e s t对象唯一的方法及说明如表 2 - 3所示,它允许访问从一个 < F O R M >段中传递给服务器的用户请求部分的完整内容。
表 2-3 Request对象的方法及说明方 法 说 明
B i n a r y R e a d (c o u n t) 当数据作为 P O S T请求的一部分发往服务器时,从客户请求中获得 c o u n t字节的数据,返回一个 Va r i a n t数组 (或者 S a f e A r r a y )。如果 A S P代码已经引用了 R e q u e s t,F o r m
集合,这个方法就不能用。同样,如果用了 B i n a r y R e a d方法,就不能访问
R e q u e s t,F o r m集合
2.2.2 Response对象成员概述这一节概要介绍所有的 R e s p o n s e对象成员,及每个成员的主要说明。
1,Response对象的集合
R e s p o n s e对象只有一个集合,如表 2 - 4所示,该集合设置希望放置在客户系统上的 c o o k i e
的值,它直接等同于 R e q u e s t,C o o k i e s集合。
表 2-4 Response对象的集合及说明集合名称 说 明
C o o k i e s 在当前响应中,发回客户端的所有 c o o k i e的值,这个集合为只写
36计计 ASP 3 高级编程 下载
2,Response对象的属性
R e s p o n s e对象也提供一系列的属性,可以读取 (多数情况下 )和修改,使响应能够适应请求。
这些由服务器设置,我们不需要设置它们。需要注意的是,当设置某些属性时,使用的语法可能与通常所使用的有一定的差异。这些属性如表 2 - 5所示。
表 2-5 Response对象的属性及说明属 性 说 明
B u ff e r = Tr u e | F a l s e 读 /写,布尔型,表明由一个 A S P页所创建的输出是否一直存放在 I I S缓冲区,
直到当前页面的所有服务器脚本处理完毕或 F l u s h,E n d方法被调用。在任何输出 (包括 H T T P报头信息 )送往 I I S之前这个属性必须设置。因此在,a s p文件中,
这个设置应该在 <% @ L A N G U A G E =,,,% >语句后面的第一行。 ASP 3.0缺省设置缓冲为开 ( Tr u e ),而在早期版本中缺省为关 ( F a l s e )
CacheControl "s e t t i n g" 读 /写,字符型,设置这个属性为,P u b l i c”允许代理服务器缓存页面,如为,P r i v a t e”则禁止代理服务器缓存的发生。
C h a r s e t = "v a l u e" 读 /写,字符型,在由服务器为每个响应创建的 HTTP Content-Type 报头中附上所用的字符集名称 (例如,I S O - L AT I N - 7 )
Content Type ="M I M E - t y p e" 读 /写,字符型,指明响应的 H T T P内容类型,标准的 M I M E类型 (例如
,t e x t / x m l”或者,I m a g e / g i f” )。假如省略,表示使用 M I M E类型,t e x t / h t m l”,
内容类型告诉浏览器所期望内容的类型
Expires m i n u t e s 读 /写,数值型,指明页面有效的以分钟计算的时间长度,假如用户请求其有效期满之前的相同页面,将直接读取显示缓冲中的内容,这个有效期间过后,页面将不再保留在私有 (用户 )或公用 (代理服务器 )缓冲中
Expires Absolute # d a t e [ t i m e ]# 读 /写,日期/时间型,指明当一个页面过期和不再有效时的绝对日期和时间
I s C l i e n t C o n n e c t e d 只读,布尔型,返回客户是否仍然连接和下载页面的状态标志。在当前的页面已执行完毕之前,假如一个客户转移到另一个页面,这个标志可用来中止处理 (使用 R e s p o n s e,E n d方法 )
P I C S ( " P I C S -L a b e l - s t r i n g" 只写,字符型,创建一个 PICS 报头并将之加到响应中的 HTTP 报头中,
PICS 报头定义页面内容中的词汇等级,如暴力、性、不良语言等
S t a t u s = "Code message" 读 /写,字符型,指明发回客户的响应的 HTTP 报头中表明错误或页面处理是否成功的状态值和信息。例如,200 OK”和,404 Not Found”
3,Response对象的方法最后,R e s p o n s e对象提供一系列的方法,如表 2 - 6所示,允许直接处理为返给客户端而创建的页面内容。
表 2-6 Response对象的方法及说明方 法 说 明
A d d H e a d e r (" n a m e "," c o n t e n t ") 通过使用 n a m e和 C o n t e n t值,创建一个定制的 H T T P报头,并增加到响应之中。不能替换现有的相同名称的报头。一旦已经增加了一个报头就不能被删除。这个方法必须在任何页面内容 (即 t e x t和 H T M L )被发往客户端前使用
A p p e n d To L o g (" s t r i n g ") 当使用,W3C Extended Log File Format”文件格式时,对于用户请求的
We b服务器的日志文件增加一个条目。至少要求在包含页面的站点的
,Extended Properties”页中选择,URI Stem”
B i n a r y Wr i t e (S a f e A rr a y) 在当前的 H T T P输出流中写入 Va r i a n t类型的 S a f e A r r a y,而不经过任何字符转换。对于写入非字符串的信息,例如定制的应用程序请求的二进制数据或组成图像文件的二进制字节,是非常有用的第 2章 请求和响应的处理 计计 37下载
(续 )
方 法 说 明
C l e a r ( ) 当 Response,Buff e r为 Tr u e时,从 I I S响应缓冲中删除现存的缓冲页面内容。
但不删除 H T T P响应的报头,可用来放弃部分完成的页面
E n d ( ) 让 A S P结束处理页面的脚本,并返回当前已创建的内容,然后放弃页面的任何进一步处理
F l u s h ( ) 发送 I I S缓冲中所有当前缓冲页给客户端。当 R e s p o n s e,b u ff e r为 Tr u e时,可以用来发送较大页面的部分内容给个别的用户
R e d i r e c t ( " u r l " ) 通过在响应中发送一个,302 Object Moved” H T T P报头,指示浏览器根据字符串 u r l下载相应地址的页面
Wr i t e ( " s t r i n g " ) 在当前的 H T T P响应信息流和 I I S缓冲区写入指定的字符,使之成为返回页面的一部分在本书中源代码的例子里,读者会发现一系列的页面,演示如何使用这些由
R e q u e s t和 R e s p o n s e对象提供的属性、方法和集合。在从 Wrox We b站点下载的
C h a p t e r 0 2目录下,有本章其余部分的示例页面。
2.3 使用 F o r m和 Q u e r y S t r i n g集合当用户填写页面 < F O R M >内容时所提供的全部值,或在浏览器地址栏输入在 U R L后的值,
通过 F o r m和 Q u e r y S t r i n g集合为 A S P脚本所用。这是在 A S P代码中访问值的一种简单方法。
2.3.1 访问 A S P集合的一般技术大多数 A S P集合与在 V B中见到的普通集合相差不多。实际上,它们是值的数组,但能通过使用一个文本字符串键 (对大小写不敏感 )以及一个整型索引进行访问。因此,假如客户端
We b页面包含的 < F O R M >如下:
可通过访问 A S P的 F o r m集合来访问其控件内的值:
也可使用窗体中控件的整型索引,索引的范围从在 H T M L中第一个定义的控件开始,然后根据定义的顺序排序:
然而,后面的这种以整型为索引的技术不推荐使用,因为一旦 H T M L中的控件发生了变化,或者插入一个新的控件,则 A S P代码将得到错误的值。进一步而言,对于阅读代码的人来讲,极容易混淆。
1,访问集合的全部值可以通过引用集合把整个 F o r m上的一系列值变成单个的字符变量,且不用提供键或索引。
假如文本框包含值 P r i s c i l l a和 D e s c a r t e s,则 R e q u e s t,F o r m语句将返回下列字符:
38计计 ASP 3 高级编程 下载注意,提供的值是以名称/值对的形式出现的 (即控件名称=控件值 ),并且每一对名称/
值相互之间是用符号,&”相分隔的。假如打算把窗体中的内容传递单独的希望得到值的标准格式的可执行应用程序或 D L L,这个技术是很有用的。然而,一般说来,都是通过以窗体中控件名称为文本键来访问集合中的内容。
2,遍历一个 A S P集合有两种方式遍历一个 A S P集合中的所有成员,方式与普通 V B集合的基本相同。每个集合提供一个 C o u n t属性,返回的是集合中条目数量。可通过使用一个整型索引使用 c o u n t属性来遍历集合。
假如先前的窗体包含 P r i s i l l a和 D e s c a r t e s值的两个文本框,将得到如下结果:
然而,更好的方法是使用 For Each...Next结构。
这带来的好处是既可以访问控件的名称又可访问其值。上述代码将得到如下结果:
注意,一些浏览器返回到 A S P的 < F O R M >值可能与页面上显示的顺序不尽相同。
3,集合成员的多值性在某些情况下,A S P集合中的各个成员可能不只一个值,这种情况发生在 H T M L定义中有几个控件有相同 N a m e属性时。例如:
在 F o r m集合中,将为键,O t h e r H o b b y”创建一个条目。然而,它将包括从三个文本框中得到的值。假如在提交时,用户留下了一个或多个为空,则返回的值为空字符串。假如用户在第一和第三个文本框分别输入 G a r d e n i n g和 M o u n t a i n e e r i n g,第二个文本框为空,在我们的
A S P代码中访问 Request,Form(,O t h e r H o b b y” ),将返回字符串:
为了能够在这种情况下,访问单个值,可以用复杂一些的代码:
第 2章 请求和响应的处理 计计 39下载对于前面的包含三个 O t h e r H o b b y控件的窗体实例,这将返回:
然而,由于很少给多个文本框相同的名字,因此这种技术很少用到。
(1) HTML中的单选或选项按扭控件在 H T M L中,需要给几个控件相同的 N a m e属性的情况是单选 (或选项 )按钮,例如:
因为用户只能选择多项中的一个 (这就是给它们相同的名字的原因 ),将仅得到一个返回值,
浏览器只能发送所选择控件的值。因此,假如这个窗体的用户已经选择了,E u r o p e”,将得到这个条目,通过遍历 F o r m集得到其值:
由于为每个控件提供了不同的 VA L U E属性,反映了每个条目所对应的国家或地区的名称。
假如省略了 VA L U E属性,浏览器将返回的值为,o n”,因此将得到:
这是不经常用到的,因此一般对使用相同名称的单选控件使用 VA L U E属性。
(2) HTML复选框控件当一个窗体中 H T M L源码包含一个复选框控件时,一般都给定唯一的名称,例如:
在这种情况下,提交窗体时,假如仅是第一和第三个复选框被选中 (加标记 ),遍历 F o r m
集合时,会得到下列值:
然而,假如为每个复选框提供一个值,把这个值发往服务器代替字符串,o n” 。例如窗体如下:
40计计 ASP 3 高级编程 下载如果除第三个复选框外,全部提交,在 R e q u e s t,F o r m集合会产生下列结果:
假如编写更复杂一些集合遍历代码,如先前所述 (单独显示每个子键 ),就得到这样结果:
需要注意的是两种情况,没有选中的控件根本不返回任何值。在第一种情况的结果里,
没有期骗性的逗号,第二种情况也没有空值。这与上述的使用文本框的相当的测试的结果不一样。使用文本框时,每个文本框都返回一个值,即使是一个空字符串。这是浏览器造成这样的结果。因此在 A S P代码中访问集合时,要注意这个问题。
上述情况一个棘手的负作用是使用复选框时,复选框值的索引与在原始的 H T M L
中控件的位置没有任何联系,在上述的例子中第四个复选框的子键数为 3,因为当窗体提交时,第二个控件没有选中。
(3) HTML列表控件
H T M L中的 < S E L E C T >标记用来产生标准的下拉列表框,其值以一种有趣的混合方式表示。
下列的窗体创建了包含 5个值可供用户选择,由于包含了 M U LT I P L E属性,因此可以通过选择时按下 S h i f t或 C t r l键,选择不仅一个的条目。
图 2 - 2所示为该页面,显示的是选中了三个条目。
这种特殊的情况返回的是在 F o r m集合中单个条目,它包含选择的值 (单个的 < O P T I O N >标记中指定的 VA L U E属性 ),用逗号分隔:
假如使用更加复杂一些的集合遍历代码 (单独显示每个子键 ),将得到:
这与上述的相同名称的复选框的情况相同。事实上可以认为一个 S E L E C T列表是一列复选框的列表供选择 (不是选中 )相应的条目。
然而,列表框也有指定的值,假如在 < O P T I O N >标记中设置 VA L U E属性,将得到的是选择的选项的文本内容,R e q u e s t,F o r m集将包含这样一个项目:
第 2章 请求和响应的处理 计计 41下载图 2-2 HTML列表控件屏幕并且,同样,复杂一些的集合遍历代码将返回如下结果:
当然,假如单个项目被选择,且在 <OPTION>中提供了 VALUE属性,得到结果包含的仅是:
H o b b y = H o b b y 0 2 5
如果没有提供 VA L U E属性,得到:
H o b b y = S w i m m i n g
这允许既可以缺省 (即无 VA L U E )显示选项文本,也可做相应的改变。后一种情况在某些情况下是极为有用的,如要显示 (一个说明的字符串 )和传递一个完全不同的内容 (如用一个短码代表一个说明性的字符串 )。
(4) HTML提交和图像控件复选框和单选框是布尔型控件的例子,选中或选择返回的为,o n”,不像文本框和大多数其他的 H T M L控件,浏览器不包含没有选中或没有选择的控件的值。
还有另外一种常用的布尔型控件,称为 H T M L按钮。如 <INPUT TYPE=,S U B M I T” >、
<INPUT TYPE=,R E S E T” >,<INPUT TYPE=,I M A G E” >,<INPUT TYPE=,B U T TO N”
>和 < B U T TO N >,,,</ B U T TO N >类型。
B U T TO N类型的控件不返回任何值,因其对窗体没有直接的影响。即使使用用来调用窗体的 S u b m i t方法,浏览器在任何请求中将不包含 B U T TO N类型控件的值。同样,一个
< I N P U T T Y P E=,R E S E T” >按钮的值也决不会发往服务器。
然而,输入按钮控件 S U B M I T和 I M A G E类型实际提交窗体给服务器,其 VA L U E属性包含窗体的其他控件的值 (只要在 H T M L定义中包含一个 N A M E属性 )。例如,这个窗体可能是向导类型 We b应用程序的一部分,允许用户一步步进行或取消进程:
在一个窗体中,可以包括多个 S U B M I T按钮。在这种情况下,应该给每一个按钮唯一的
VA L U E属性,如上所示。当一个窗体被提交时,遍历 R e q u e s t,F o r m集合的值,将产生一个值,
这个值依赖于按下哪个按钮用于提交这个窗体。假如用户按下的,P r e v i o u s”按钮,将得到:
因此,可查询 R e q u e s t,F o r m集合来决定下一个显示的页面,例如:
42计计 ASP 3 高级编程 下载同时,也可根据需要对每个按钮使用不同的 N A M E属性。且选择其值包含在 F o r m集合中的控件名称。在控件没有一个完整的标记而是随后跟着较长的文本标签的情况下,极为有用,
如图 2 - 3所示。
图 2-3 提交按钮屏幕此屏幕上的界面由下列代码产生:
在 A S P页面中,接收到该数据后,可以检查按钮名称提供的值来判断按下的是哪个按钮。
这个工作是查询一个键上的 A S P集合,如果不存在则返回一个空的字符串。换句话说,
如果第二个按钮 ( p r e v i o u s页 )按下,则 R e q u e s t,F o r m (,b t n N e x t” )的值是一个空字符串,则其长度为零而不至于产生一个错误。当第二个按钮按下时,则在 F o r m集合中这个条目的值
R e q u e s t,F o r m (,b t n P r e v i o u s” ),将是,& n b s p ; & n b s p ; & n b s p ;”其长度大于零。
(5) 提高使用 R e q u e s t集合的效率访问一个 A S P集合来下载一个值是费时的需计算资源的过程,因为这个操作包含了一系列对相关集合的搜索,这比访问一个局部变量要慢得多。因此,如果打算在页面中多次使用集合中的一个值,应该考虑将其存贮成为一个局部变量,例如:
第 2章 请求和响应的处理 计计 43下载
(6) 搜索所有的 R e q u e s t集合在某些情况下,可能知道一个值的键名将出现在 R e q u e s t集合中,但不能准确地知道是哪一个集合。例如,假如有几个页面 (或一页面的不同段 )发送一个值给同一个 A S P脚本,它可能在 F o r m或者 Q u e r s t r i n g集合中出现。
本章后面部分将研究 F o r m和 Q u e r y S t r i n g集合的差异。
要看一下一个值为什么可能出现在不同的集合中,考虑一下这种情况:使用了 < A >超级链接元素请求一个页面。在这种情况下,增加一个值到请求的唯一方法是把它加到 U R L上。
然而,同样的值可能已出现在另一个页面的 < F O R M >中,或同一页面不同部分:
在这种情况下,按下窗体上的 H e l p按钮,将发送 R e q u e s t,F o r m集合中一对名称/值
,p a g e = H e l p” 。然而,按下 < A >超级链接也可能发送名称 /值,p a g e = H e l p”,但是这次却是在
Q u e rg s t r i n g集合里。为访问这个值,可使用 ASP Request对象的一个特殊功能:
这将按序搜索全部的集合 — Q u e r y S t r i n g,F o r m,C o o k i e s,C l i e n t C e r t i f i c a t e、
S e r v e r Va r i a b l e s,直到发现第一个匹配值的名称。这样做比直接访问适当的集合效率低,并且是不安全的,除非能绝对保证这个值不会出现在另外一个集合中。
例如,可能希望搜集满足客户请求的 We b服务器的名称,这通过出现在每个查询中的
R e q u e s t,S e r v e r Va r a b l e s集合中寻找,S RV E R _ N A M E”来实现。然而,假如任一其他的集合也包含名为,s e r v e r _ n a m e”的值 (记住键名不区分大小写 ),当使用 R e q u e s t (,s e r v e r _ n a m e” )时,得到的是错误的结果。使用 R e q u e s t,S e r v e r Va r i a b l e s (,s e r v e r- n a m e” ) 句法,我们将很难进行错误追踪。
总而言之,使用“搜索全部集合”技术要格外小心,且只在没有其他技术能够提供你需要的结果时使用。
(7) 访问其他的集合本章的这一节里,已经集中讨论了 F o r m集合,这可能是使用得最多的一个。然而,所有这些技术同样适用于其他的对象。包括那些由 R e q u e s t对象提供的 (即 F o r m,Q u e r y S t r i n g、
C o o k i e s,S e r v e r Va r i a b l e s和 C l i e n t C e r t i f i c a t e )集合,及由 R e s p o n s e对象提供的 c o o k i e s (及将在下两章遇到的其他对象提供的集合 )。
我们将简短了解一个值如何进入一个 Q u e r y S t r i n g集合,及其优点和不足。然而,同时这两个 C o o k i e s集合有额外的功能,可以使使用 c o o k i e更加方便,下面讨论这个内容。
2.3.2 访问和更新 C o o k i e s集合
C o o k i e s的值比 A S P其他集合 (例如 F o r m和 S e r v e r Va r i a b l e s )的值要复杂得多。 c o o k i e是一小
44计计 ASP 3 高级编程 下载块由浏览器存贮在客户端系统上的文本,且随同每次请求发往它们应用于的域中的服务器。
A S P使得应用 c o o k i e较为容易,可以从 R e q u e s t对象的 C o o k i e s集合中获得所有随同请求发出的 c o o k i e的值,并可创建或修改 c o o k i e,通过 R e s p o n s e对象的 C o o k i e s集合发回给用户。
c o o k i e包含可用两种方式构造的信息,单值 c o o k i e提供其值给代码是通过一个一般的类
A S P集合。然而,集合的每个成员可能本身也是一个集合,包含这种信息的 c o o k i e通常称为多值 ( m u l t i p l e - Va l u e ) c o o k i e。
创建一个单值的 c o o k i e较为简单,如下所示:
创建一个多值的 c o o k i e,可以使用如下命令:
设置 c o o k i e应用的域及路径及其有效期,我们使用:
通常,客户只在对创建 c o o k i e的目录中的页面提出请求时,才将 c o o k i e随请示发往服务器。
通过指定 p a t h属性,可以指定站点中何处这个 c o o k i e是合法的,并且这个 c o o k i e将随请求发送。
如果 c o o k i e随对整个站点的页面请求发送,设置 p a t h为,/” 。
假如 E x p i r e s属性没有设置,关闭当前的浏览器实例时,c o o k i e将自动被消除。
注意,我们在向浏览器发送任何输出时,已经创建了 c o o k i e,因为,这些 c o o k i e
是页面 H T T P报头的一部分。
在 ASP 3.0中,缓冲的缺省状态是打开的,且没有输出被发送,除非使用
R e s p o n s e,F l u s h指定做这个工作或者页面已到末端。这意味着创建 c o o k i e的代码可以在页面上的任何位置,直到任何输出“刷新” ( f l u s h )到客户端前,它都可以被执行。
要读现有的 c o o k i e,使用 R e q u e s t,C o o k i e s集合。可以单独访问其中项目,方法类似于创建它们时使用的方法。
注意 R e q u e s t,C o o k i e s集合 (和所有其他 R e q u e s t集合一样 )是只读的。 R e s p o n s e,C o o k i e s集合是只写的,事实上可以访问这个集合中一系列 c o o k i e的名称,而不是它们的值。
遍历 C o o k i e s集合为了使用 C o o k i e s集合更加方便,可使用名称为 H a s k e y s的附加属性。假如访问的 c o o k i e本身也是个集合,即它是一个多值的 c o o k i e,这将返回 Tr u e。使用 H a s k e y s属性,可以遍历完整的 R e q u e s t,C o o k i e s集合,从而获得所有 c o o k i e的列表及它们的值。
第 2章 请求和响应的处理 计计 45下载这非常类似于前面的从 R e q u e s t,F o r m集合中提取多个值的复杂代码。但是这里可以使用 H a s k e y s属性来判别每个条目是否为一个集合。而在 F o r m例子里,必须查询
R e q u e s t,F o r m ( i t e m _ n a m e ),C o u n t属性,这是因为 F o r m集合 (和所有的除 c o o k i e外的其他集合 )成员不可能是真正的集合。 A S P只是做了“幕后”的工作,得到了每个多条目集合的值。
2.3.3 Form和 Q u e r y S t r i n g的差异了解了访问各种 A S P集合的技术以后,需要解决另一个问题是,F o r m和 Q u e r y S t r i n g集合之间的差异是什么?假如准备使用 A S P,毫无疑问应该清楚这种差异,但需要参考 H T T P工作方式来重新认识,理解它们。
通过 H T T P从 We b服务器请求页面或其他资源,有两个通用的方法。可使用 G E T方法直接获得资源,也可使用 P O S T把值传给相应资源。 G E T方法是缺省的,可以看一下本章前面的一个 H T T P请求的实例:
假如把一个或多个成对的名称/值附在请求页面的 U R L后,就变成请求的查询字符串,
且在 Q u e r y S t r i n g集合中提供给 A S P页面。单击 We b页面,e m a i l消息或其它文档的超链接,或在浏览器的地址栏中输入地址并按回车,或单击浏览器中的 L i n k s或 F a v o r i t e s按钮,所有这些都要使用 G E T方法。
因此,从这些动作中传递值给 A S P的唯一方法是通过 Q u e r y S t r i n g集合,把值附在 U R L后。
出现在 R e q u e s t,Q u e r y S t r i n g集合中并被访问的值,与前面看到的 F o r m集合实例中的工作方式相同。 U R L和查询字符串的结合:
可以采用如下方式访问在 Q u e r y S t r i n g集合中提供的值:
窗体的 G E T和 P O S T方法在一个页面内使用 < F O R M >段时,可以设置打开的 F O R M标记的 M E T H O D属性值为
,G E T”或,P O S T” 。缺省值为,G E T” 。假如使用,G E T”或省略其属性,浏览器将该值绑定在页面所有控件上,成为一个查询字符串,且附在被请求页面的 U R L上。
当这个请求到达 We b服务器时,其值由 A S P的 R e q u e s t,Q u e r y S t r i n g集合提供。然而,假如设置 M E T H O D属性为,P O S T”,浏览器将值包装进发送到服务器的 H T T P报头中,通过
R e q u e s t,F o r m集合提供给 A S P。
通常来说,可以在所有的 H T M L窗体中使用 P O S T方法。然而,浏览器或服务器的 U R L字符串长度存在一定的限制。因此,附有长的字符串可能会引起溢出和某些字符串的字符被截掉。同时,查询字符串出现在浏览器的地址栏和所有的保存的链连和收藏夹中。不仅如此,
46计计 ASP 3 高级编程 下载还显露了通过 We b服务器时在 H T T P请求中不想显示的值,它也可能出现你的服务器和其他路由服务器的日志文件中。在 H T T P请求报头中的值很少是可见的,并且不出现在日志文件中。
使用 P O S T方法需要注意的小问题是,当用户重新下载 < F O R M >时,窗体的值将不再保留,
其值为空且必须重新输入。然而,当附在 U R L上时,其值被存储为一个链接,将被保留,因此将出现在所有的 U R L与字符串结合的请求中,这或许是个优点也可能是个缺点,这根据应用而定 (一些浏览器在客户端上能够在一定范围内自动保留一个页面上的值 )。
另一点是 U R L与查询字符串的结合体不能包含任何空格或其他非法字符,否则的话,N a v i g a t o r和一些其他的浏览器将出现问题。非法字符是那些用来分隔 U R L和查询字符串的部分,例如“/”,,:,,,?”,和,&” ( I E能够自动将空格转换为正确的格式 — 加号“+” 。但其他的非法字符不能处理 )。 A S P服务器对象提供
U R L E n c o d e方法处理这种变换,第 4章将讨论相关内容。
2.3.4 查看 R e q u e s t和 R e s p o n s e对象内容到目前,主要讨论了一些理论问题,没有列举特别的实例。因为已经讨论过的内容多数情况下互相之间是密切相关的。然而本书为这一章提供了一系列的实例页面,说明 R e q u e s t和
R e s p o n s e对象的大多数属性。应用所讲过的实例,能够理解这些页面,并可进行相应的修改,
用它们作为试验实例。
本章及其他所有章节的代码样例均提供给用户,可以从 Wr o x出版社站点下载。
必须首先在 Web 服务器的 W W W R o o t内的子目录下安装实例,然后使用浏览器访问
C h a p t e r 0 2子目录,使用:
这里 y o u r _ s e r v e r _ n a m e _ o r _ I P / s u b d i r e c t o r y _ n a m e是安装下载文件的本地路径。
1,查看 R e q u e s t对象成员这提供一个包含选项的菜单用来试验 R e q u e s t和 R e s p o n s e对象,首先选择 Using the Request
O b j e c t,如图 2 - 4所示。
图 2-4 实例屏幕 1
图 2 - 5显示一个 H T M L窗体的实例,包含一些预先设置好的值,可以按自己的想法编辑这些值,然后点击,S u b m i t”按钮。
这将打开一个页面,如图 2 - 6所示,显示集合和 To t a l B y t e s属性的全部内容。第一屏显示的是 F o r m,Q u e r y S t r i n g和 C o o k i e s集合。
第 2章 请求和响应的处理 计计 47下载图 2-5 实例屏幕 2
图 2-6 实例屏幕 3
注意,假如在窗体页中编辑了 H T M L控件的值,对于 C o o k i e s集合以及其他的集合,在读者计算机上的页面上可能有不同的值。
可以从,Form Collection”段中看到窗体上的 H T M L控件的值如何在 A S P的 R e q u e s t,F o r m
集合中表示。也可以用原始的 < F O R M >页 (名称为 r e q u e s t _ f o r m,a s p )来试验和检测,以了解创建窗体的 H T M L和如何与相应值相联系。
这个页面后面是 C l i e n t C e r t i f i c a t e集合。这里是空的,因为服务器不要求客户端提供证书。
下面的是 S e r v e r Va r i a b l e s集合,图 2 - 7的屏幕图显示的是集合中包含的有用的值。
在本书的后面附录中可以找到所有 S e r v e r Va r i a b l e s集合成员的一个列表,及其值的说明。然而,可从前面讨论的在请求页面时从客户端发出的 H T T P报头中见到这些成员。当请求收到后,We b服务器也增加它本身的一些值到集合中,正如下面可以看
48计计 ASP 3 高级编程 下载到的由运行在名为 w r o x b o x服务器上的 IIS 5.0创建的页面那样。
图 2-7 实例屏幕 4
(1) 页面是如何工作的为创建这个页面,使用了本章前面在对 F o r m集合和如何访问其值的讨论中所看到的完全相同的代码。例如,遍历所有的集合 (除 R e q u e s t,C o o k i e s外 ),使用:
遍历 C o o k i e s集合,可以使用:
第 2章 请求和响应的处理 计计 49下载为获得 To t a l B y t e s属性,可简单地使用:
读者应该注意到,在两个集合中出现的某些值不是从窗体的 H T M L控件中直接得到的。 Q u e r y S t r i n g集合包括了两个名为 c h a p t e r和 s a m p l e的值,如图 2 - 8所示。
为在请求中创建这两个值,将一个字符串附在窗体的 A C T I O N属性的 U R L上,这是可以接受的。工作方式与附在一个 < A >元素的 H R E F属性上相类似。查询字符的值出现在 Q u e r y S t r i n g集合中,且被 P O S T的窗体控件值出现在 F o r m集合中。
为防止非 I E类的浏览器出现错误,必须将查询字符串中的空格用加号“+”来代替,读者将在第 4章的 S e r v e r对象的 U R L E n c o d e方法中看到更多这种情况。
(2) 创建客户端的 c o o k i e
为了确保至少有些值出现在 R e q u e s t,C o o k i e s集合中,增加一些客户端脚本代码到原始的
< F O R M >页面 r e q u e s t _ f o r m,a s p。将创建名称为
Vi s i t C o u n t的多值 c o o k i e。另一个 c o o k i e是由另一个页面创建的,且已经存在于浏览器中。如图 2 - 9
所示,读者可以看到另外的 c o o k i e。
这是一段当窗体被装载时设置文档对象的
c o o k i e s属性的客户端代码:
另外,必须将内容进行编码,以便它能被正确地传送到服务器 (同样的规则也适用于将查询字符串附到 U R L上 )。在第 4章中,讨论 S e r v e r对象的 U R L E n c o d e方法时,
读者将了解到更多细节。
2,查看 R e s p o n s e对象的成员回到 C h a p t e r 0 2实例的最初的 D e f a u l t,a s p页面,这次选择,Using the Response Object”链接,这个页面显示的是 R e s p o n s e对象的集合和属性的内容,且提供到所有 R e s p o n s e对象方法的链接。
图 2 - 1 0是使用浏览器 Netscape Communicator4.61的屏幕,用来证明使用的是纯服务器端和跨平台兼容技术。需要注意的是 C o o k i e s集合是为 R e s p o n s e对象而建立的,仅显示 c o o k i e的名称而不显示其值。浏览该页时,可能得不到 c o o k i e或得到与这个页面不同的 c o o k i e。
各种 R e s p o n s e属性说明了将要用来创建 H T T P报头的一些信息。 H T T P报头与页面的其他部分 ( H T M L和文本内容 )被发往到客户端。这些属性中的一些以及所有的 R e s p o n s e对象的方法均有链接,允许读者打开另一个页面来显示其使用情况。我们稍后再回到这些页面。
页面中的属性是通过读取相应的属性并插入到页面中而创建的。由于这些是动态链接,
通过 < A >元素来选择。
50计计 ASP 3 高级编程 下载图 2-8 实例的集合内容图 2-9 实例的 c o o k i e内容图 2-10 实例的 R e s p o n s e对象的集合和属性的内容链接到每个方法仅是通过 < A >链接元素,页面中唯一复杂的部分是 R e s p o n s e,C o o k i e s集合。
通常只能访问 c o o k i e,读取 R e q u e s t,C o o k i e s集合中的值。当访问 R e s p o n s e,C o o k i e s集合时,必须在发送任何输出到客户端之前结束对它的所有引用。因此在页面的上部,通过遍历集合创建页面的 H T M L放在一个局部字符串变量中。
然后在页面的适当点上插入结果。
第 2章 请求和响应的处理 计计 51下载
2.3.5 ASP中 c o o k i e的使用在前面所看到页面中,一些集合、属性和方法已经链接到其他的页面,用来显示 R e q u e s t
和 R e s p o n s e对象的各个特性细节,我们将在本章的其余的部分研究这些内容,我们将学习那些提供给 A S P代码使用的集合、方法和属性的各种技术。
在本章前面已经看到了如何使用 R e q u e s t,C o o k i e s和 R e s p o n s e,C o o k i e s集合来创建和阅读
c o o k i e,点击上面两个页面中任一个的,C o o k i e s”链接时,这个页面包含一些设置了三个
c o o k i e的值的 A S P代码,且在页面上显示被执行的代码,如图 2 - 11所示。
图 2 - 11 实例的 R e s p o n s e,C o o k i e s的内容屏幕 1
点击,Show Cookies”的链接时,c o o k i e的内容就显示出来了。这是通过遍历
R e q u d e s t,C o o k i e s集合而得到的,这与在上一页所用到的方式完全相同,如图 2 - 1 2所示。
图 2-12 实例的 R e s p o n s e,C o o k i e s的内容屏幕 2
这个屏幕图显示的是运行前面看到的设置 c o o k i e值的代码的结果。可能会看到其他已经存贮在计算机系统里的 c o o k i e。然而,假如现在关闭浏览器然后重新打开浏览器,然后运行显示
c o o k i e的页面,除了 Ti m e d C o o k i e外,所有的 c o o k i e都不见了,这是由于只有这个 Ti m e d C o o k i e
具有有效期的设置,其他的在浏览器关闭时,自动消失了。
1,cookie中存储用户的细节情况可以使用 c o o k i e来存储这两类值:当浏览器关闭时我们不想保存的值 (例如用户的注册信息 )以及在用户访问站点时要保留的值。在每种情况下 c o o k i e的值对于来自用户浏览器的每个
52计计 ASP 3 高级编程 下载页面请求的 A S P都是可用的。
然而,需要记住的是,c o o k i e只有在对 C o o k i e中的虚拟路径 ( p a t h )内的页面发出请求时,
才会发往服务器。缺省时,假如 p a t h的值在 c o o k i e中没有设置,则其值为创建 c o o k i e的页面的虚拟路径。为使一个 c o o k i e发往一个站点的所有页面,需要使用 P a t h = " / "。
这里是个实例,从自定义的 L o g i n页面中,将用户的注册信息存贮在一个 c o o k i e中,由于没有应用有效期,c o o k i e值仅在关闭这个浏览器之前保留:
现在,在用户从 a d m i n s t u ff目录或其子目录请求的每个页面中,都可以找到这个 c o o k i e。
假如它不存在,可以将用户重定向到注册页面:
由于把 c o o k i e中的用户名放在 R e s p o n s e,R e d i r e c t的 U R L查询字符串中,假如在口令输入时出现错误且希望用户不必重新键入用户名,可以在 l o g i n,a s p页面中使用它:
2,修改现有的 c o o k i e
可以使用 A S P修改现有的 c o o k i e,但不能只多值 c o o k i e中的一个值。当更新一个在
R e s p o n s e,C o o k i e s集合中的 Co o k i e时,现有的值将丢失。我们可以用如下代码创建一个 c o o k i e,
可以使用:
假如想要更新 Vi s i t s和 L a s t D a t e的值,必须先找到不需改变的所有值,然后重写整个的 c o o k i e:
且对于几乎所有的其他 R e s p o n s e方法和属性,应该在写入任何内容 (即打开 < H Y M L >标记或任何文本或其他的 H T M L )到响应之前完成这个工作。
2.4 使用 S e r v e r Va r i a b l e s集合当讨论 R e q u e s t对象的内容时,要研究的集合之一就是 S e r v e r Va r i a b l e s集合。这个集合包第 2章 请求和响应的处理 计计 53下载含了两种值的结合体,一种是随同页面请求从客户端发送到服务器的 H T T P报头中的值,另外一种是由服务器在接收到请求时 本 身 所 提 供 的 值 。 为 显 示 S e r v e r
V a r i a b l e s 集合中值的使用方式,在
Request Object页面 ( S h o w _ r e q u e s t,a s p )中,
点击,S e r v e r Variables Examples”链接,
打开另外一个页面,如图 2 - 1 3所示。
图 2 - 1 4所示窗口显示的是 S e r v e r
Va r i a b l e s集合中一些非常有用的值的一个子集。
图 2-14 实例的 Response Collections的内容屏幕 2
2.4.1,自引用”页面在 S e r v e r Va r i a b l e s集合中返回的值包含 We b服务器的详细信息和当前页面的路径信息。在任何地方创建一个页面都可使用这些信息。例如创建一个“自引用”页面,此页面能够再次调用自身完成另一项任务,我们可以用以下代码:
同样的效果可以用 H T T P的,S C R I P T _ N A M E”值获得:
使用 < A >元素打开一个不同页,可以使用:
54计计 ASP 3 高级编程 下载图 2-13 实例的 Response Collections的内容屏幕 1
即使原始页面的名称或位置发生变化,这些实例都能正常工作,因为使用了当前页面的路径信息 (当然,第二个例子在分离的目标页的名称发生变化时运行会失败 )。
换句话说,如要为搜索引擎的子会话自动建立 U R L,可以收集 S e r v e r Va r i a b l e的一些值:
这将创建一个完整的 U R L包括端口号 (这种情况下,不是标准值 8 0 )。例如,结果可能是:
h t t p,/ / 1 9 4,7 4,6 0,2 5 4,1 7 6 8 / t h i s p a t h / t h i s p a g e,a s p
2.4.2 检测浏览器的版本
S e r v e r Va r i a b l e s集合中,另外一个有用的值是用户浏览器的用户代理字符串。在
,Detecting the Browser Ty p e”页面 ( b r o w s e r t y p e,a s p ),使用 S e r v e r Va r i a b l e s集合中的
,H T T P _ U S E R _ A G E N T”值来获得用户代理字符串,一些脚本用来解析该信息并寻找生产厂家名称和浏览器版本。
第 2章 请求和响应的处理 计计 55下载对 IE 5.0和 Navigator 4.61的搜索结果分别如图 2 - 1 5和图 2 - 1 6所示。对于其他厂家的浏览器,
可以得到一个链接在 A l t a Vista We b站点自动开始搜索厂家的名称。
图 2-15 IE 5.0中显示的结果图 2-16 Navigator 4.61中显示的结果注意,N e t s c a p e在用户代理字符串中不提供厂家的名称,因而无法绝对保证一个浏览器一定是 N a v i g a t o r。
2.4.3 检测浏览器的语言
S e r v e r Va r i a b l e s集合中另外一个有用的值是,H T T P _ A C C E P T _ L A N G U A G E”,它包含了一个当浏览器安装时指定的,或硬编码进用户的地区版本的语言代码。语言代码的例子有 e n -
u s (英国、美国 ),d e - a t (德国、澳大利亚 )和 e s - p e (西班牙、秘鲁 )。
语言代码可以是一般的且省略方言标识:例如,在我们的站点 Wr o x者,大批浏览者都是将 e n (英语 )作为语言代码。
因此,可以检测语言代码并自动装载一个合适的特定地区或指定特言版本的页面。
56计计 ASP 3 高级编程 下载或者根据特定的方言,重定向页面:
2.4.4 其他有用的 S e r v e r Va r i a b l e s集合的值可以访问和使用 S e r v e r Va r i a b l e s集合中的任何一成员,控制 A S P页面响应一个请求的方式。
可以检查一个浏览者访问站点时使用的是否是缺省端口 8 0或还是另一个。在这个例子里,寻找通过端口 4 4 3的访问——这个端口提供的是安全套接字层 (Secure Socket Layer,S S I )访问 (和其他的协议 ),且将它们重定向到一个相应的页面。
假如要求浏览者注册且由服务器验证 (而不是允许他们在 We b服务器的 I U S R帐号下匿名访问,这个问题将在后面章节中详细讨论 ),可以查询用户名称,来判定正在与我们打交道的用户是谁,是否装载页面给该用户。例如,下面的这个代码将只向名为 A d m i n i s t r a t o r的用户显示管理链接。
注意 A S P不填写 S e r v e r Va r i a b l e s集合直到你访问其中的一个成员。首次访问该集合的一个成员将使 I I S得到它的全部,应只在需要时才使用 S e r v e r Va r i a b l e s集合。
2.5 其他 R e q u e s t和 R e s p o n s e技巧现在,来看一下几个使用 R e q u e s t和 R e s p o n s e对象的有用技巧,包括:
连接、缓冲和页面重定向的管理。
HTTP报头、缓存与“到期”页面的操作。
利用客户证书。
创建定制的日志文件消息。
第 2章 请求和响应的处理 计计 57下载
2.5.1 连接、缓冲和页面重定向的管理
A S P的一个很有用的特点就是使用户能够从一个 A S P网页转向到另一个网页 ( A S P或
H T M L ),或另一个源文件 (例如一个 Z I P文件或文本文件 )。这对用户来说是透明的,实际上是浏览器做这个工作。当使用 R e s p o n s e,R e d i r e c t方法来载入一个新的网页时,实际上是发送回一个特殊的 HTTP 报头到客户。此报头为:
浏览器读到此报头信息,并按 L o c a t i o n值的指示载入页面。这在功能上与在 We b页中使用客户端 H T M L < M E TA >标记相同,例如:
这带来的一个问题是,服务器与用户之间的代理服务器可能会提供它自己的包含与新页面的链接的消息,而不是直接载入新页面。而且浏览器根据厂商和版本可能做同样的工作。
这就去除了假定的透明,而且对用户来说一直收到的是错误信息,则对你的站点的访问变得比较麻烦。
在发送诸如文本或 H T M L等任何页面内容后,我们就不能再使用 R e d i r e c t方法。然而,一个看起来能够限制“代理服务器影响”的方法就是,先确定没有输出 (包括 H T T P报头 )被发送到客户。在 ASP 2.0中,必须打开缓冲,然后使用 C l e a r方法来清空缓冲区:
在 ASP 3.0中,缓冲缺省为打开,所以第一行可被忽略,但它是无害的,而且能确保我们的网页即使在 A S P 2,0环境中也仍然能工作。
与其使用这种类型的 H T T P报头重定向,不如使用 ASP 3.0的一个新特性,它允许我们通过 S e r v e r对象的 Tr a n s f e r方法转换为执行另一个网页,我们将在第 4章进一步研究这个问题。
1,ASP页面缓冲区正如已看到过的,IIS 5.0中 ASP 3.0页面缓冲是缺省打开的,在早期的版本中是缺省关闭的。微软告诉我们缓冲在 IIS 5.0中提供了更有效的网页传送,这就是缓冲缺省状态被改变的原因。在大部分情况下,这对我们没有影响。但是,假如有一个非常大的网页,或一个用
A S P或别的服务器端代码和组件花费一定时间创建的网页,当其各部分完成时,我们能够分批刷新它们到客户:
58计计 ASP 3 高级编程 下载有时可能希望在页面结束之前的某些点上停止代码的执行,可以通过调用 E n d方法去刷新所有的当前内容到客户并中止任何进一步的处理过程。
假如正在创建被缓冲的输出,且没有发往客户,则我们可以改变主意,可以使用 C l e a r方法来删除它:
这里有两个演示缓冲和重定向的实例网页,可以从,Response Object”主页面
( s h o w _ r e s p o n s e,a s p )下载它们。第一个 R e s p o n s e,R e d i r e c t例子网页命名为 r e d i r e c t,a s p,它在缓冲的页面中写入一些内容,清除缓冲区,并重定向到另一个网页:
目标页 s h o w _ r e s p o n s e,a s p,做同样的工作,但重定向则是回到,Response Object”主页。
因为这些网页都在缓冲区内,而且所有的输出在重定向之前必须被清除,故在浏览器中没有可见的输出。然而,可以通过观察浏览器的状态条看到发生的每一次重定向,如图 2 - 1 7所示。
图 2-17 浏览器的状态条在,Request Object”主页中,点击,R e s p o n s e,F l u s h”链接将打开第二个示例网页
u s e b u ff e r,a s p,它简单地遍历一个字符串的每一字符,以一定的延迟将它们刷新到客户,这虽是 We b服务器和 A S P极低效率的使用方式,但它演示了缓冲的工作方式。
图 2-18 usebuff e r,a s p运行情况第 2章 请求和响应的处理 计计 59下载下面是所要求的最小化的 A S P代码,注意我们分别把每个字符刷新到浏览器,因为不这样的话它将被存放在缓冲区中,直至网页完成:
2,Response.IsClientConnected属性
I s C l i e n t C o n n e c t e d属性在 ASP 2.0中已经存在了,但却有些不可靠。在其返回一个准确的结果之前必须发送一些输出到客户。这一问题在 ASP 3.0中已被解决。现在这一属性可被自由使用。
I s C l i e n t C o n n e c t e d是观察用户是否仍连到服务器和正在载入 A S P创建的网页的有用方式。
如果用户断开连接或停止下载,我们就不用再浪费服务器的资源创建网页,因为缓冲区内容将被 I I S丢弃。所以,对那些需要大量时间计算或资源使用较多的网页来说,值得在每一阶段都检查浏览者是否已离线:
2.5.2 操作 H T T P报头我们已经在几处见到 A S P如何创建或修改在响应页面请求时被发送到客户的 H T T P报头。
在 R e s p o n s e对象中有几个属性和方法可帮助我们做到一点。下面是一些报头方法:
控制缓存和有效期。
创建状态和定制的 H T T P报头。
指定 M I M E类型或内容类型。
添加 P I C S标签。
接下来将简要地研究每一个方面。可在,R e s p o n s e
O b j e c t”主页 ( s h o w _ r e s p o n s e,a s p )上,单击相关属性名或方法名,来检查我们所说明的属性和方法,如图 2 - 1 9所示。
1,缓存和“到期” A S P网页用户的浏览器以及他们和服务器之间的任一代理服务器,
都可以缓存 H T M L和用 A S P创建的网页。当用户随后请求页面时,浏览器就发送一个“最新修改”的请求到服务器 (使用一个包含缓存版本的日期的 H T T P _ I F _ M O D I F I E D _ S I N C E报
60计计 ASP 3 高级编程 下载图 2-19 检查属性和方法头 ),询问网页是否已被修改。
若没有被修改,服务器应用状态码和消息,304 Not Modified”来响应,浏览器将使用缓存的内容而不会通过网络下载一个副本。若已经存在已修改的版本,它就会与,200 OK”状态码和消息一道被发送出去。
(1) Response.CacheControl属性其他的一些因素也会影响这一处理过程。然而,任一被网页使用的网络路由内的代理服务器 (一般位于客户机端 ),能被通过设置 R e s p o n s e,C a c h e C o n t r o l属性为 P r i v a t e来放弃缓存网页。
在 ASP 3.0中对 A S P网页这是缺省的,不用设置。但在网页为个别访问者特别定制时尤其有用。
这可以阻止别的在同一网络上的用户进入同一网页。当 C a c h e C o n t r o l的属性值被设为 P u b l i c时,
允许代理服务器缓存网页。注意,一些代理服务器可能表现得不尽相同,或忽视或越过这个报头。
在 IE 4中,在代理服务器缓存可用时,有可能得到一个虚假的,This page has expired”消息。我们已提供了一个网页 ( e x p i r e t e s t _ f o r m,a s p ),可以通过自己的代理服务器在网络上做试验,来检查这一属性的影响。可以通过在,Response Object”主页中单击,R e s p o n s e,
C a c h e C o n t r o l”链接来显示这个网页,如图 2 - 2 0所示。
图 2-20 显示检查结果 1
这一页面提交到 e x p i r e t e s t _ r e s u l t,a s p网页时,能够设置 R e s p o n s e,C a c h e C o n t r o l属性,然后在网页中插入值和脚本被执行的时间:
通过单击浏览器上的,B a c k”和,F o r w a r d”,能看到代码是自动重执行还是使用缓存的第 2章 请求和响应的处理 计计 61下载副本,如图 2 - 2 1所示。结果随浏览器的不同而变化。
(2) Response.Expires和 R e s p o n s e,E x p i r e s A b s o l u t e属性控制缓存的网页存放时间的两个属性为
R e s p o n s e对象的 E x p i r e s和 E x p i r e s A b s o l u t e属性。
R e s p o n s e,E x p i r e s定义了网页在从缓存区被丢弃前应保持有效的时间长度,以创建以来的分钟数形式表示。 E x p i r e s A b s o l u t e属性为到期时间设置了一个绝对的日期和时间。
我们提供一个命名为 a d d h e a d e r s _ f o r m,a s p的例子网页,用于演示如何使用这些属性。在
,Response Object”主页中单击对这两种属性的链接,如图 2 - 2 2所示。
图 2-22 addheaders_form.asp显示的属性在这一页面中,可加入自己定制的 H T T P报头,并可设置一些影响响应的 H T T P报头的多种属性。在,S u b m i t”按钮上单击时,页面 s h o w _ h e a d e r s,a s p在返回的数据流中添加所选的报头,然后显示用来完成此操作的代码,显示相应的执行时间,可用来检查页面是被缓存还是被再次执行,如图 2 - 2 3所示。
图 2-23 addheaders_form.asp显示的报头
s h o w _ h e a d e r s,a s p网页中的代码创建和添加 H T T P报头,程序如下:
62计计 ASP 3 高级编程 下载图 2-21 显示检查结果 2
其余的部分仅仅是显示已被执行的代码和执行时间。读者会注意到包含在网页中的定制的报头,P R A G M A” (至今我们还没讨论过 )。一些 (先前的 )的代理服务器使用它作为网页是否应被缓存的指示。缺省是网页被缓冲,除非接受到 HTTP 报头,P R A G M A= N O - C A C H E” 。
2,创建状态码和定制的 H T T P报头可使用先前在实例网页中所看到的 R e s p o n s e对象的 A d d H e a d e r方法来创建自己的状态码或自己喜欢的定制的报头。这一方法需要两个参数,H T T P报头名称或一个包含其值或分配给它的值的字符串。作为一个例子,下面的代码在页面中添加 R E F R E S H报头:
这等同于客户机端 < M E TA >元素:
换句话说,也可配合 S t a t u s属性使用 A d d H e a d e r方法使浏览器载入一个新的页面:
这等同于使用 R e s p o n s e,R e d i r e c t方法:
R e s p o n s e,S t a t u s属性可被用来发送一些所需要的状态消息,例如添加如下几行:
强制浏览器显示一个用户名/口令对话框,然后使用 B A S I C验证把它们发送回服务器 (将在本书后续部分看到验证方法 )。
3,MIME类型和内容类型当我们想向浏览器发送一个动态创建的字符串,而且它们自己提供给浏览器时没有直接指明内容类型,而是提供表示是否是磁盘文件的扩展名时,R e s p o n s e,C o n t e n t Ty p e是非常有用的。除非特别指定,所有 A S P创建的网页缺省都为,t e x t / t y p e” 。内容类型的标识符是 M I M E类第 2章 请求和响应的处理 计计 63下载型 ( M I M E代表 Multi-purpose Internet Multimedia Extension 或 Multi-purpose Internet Mail
E x t e n s i o n,通常依据上下文来定 )。
例如,若发送到客户的数据流是通过从数据库读二进制值创建的图片,就需要在发送任何内容之前添加合适的 C O N T E N T- T Y P E报头:
假如从一个数据库创建一个 X M L文件,使用 M I M E类型,t e x t / x m l”;并且如果正在创建一个文本文件可以在文件编辑器中显示或作为一个磁盘文件在客户上被存储起来,使用,t e x t / t e x t” 。
4,添加 P I C S卷标
R e s p o n s e,P i c s属性仅仅是添加一个 PICS(Platform for Internet Content system)卷标到页面上,方式与通常用 < M E TA >标记所用的方式相同:
这段代码添加了如下的 P I C S卷标:
要得到关于 P I C S的更多的信息,或了解更多的定义页面内容的方式,请检索
h t t p,/ / w w w,r s a c,o rg /站点。
在 Internet Service Manager中定义报头在第 1章,已经说明了如何在 Internet Service Manager(MMC插件 )应用程序中设置每个
64计计 ASP 3 高级编程 下载图 2-24 HTTP Headers选项卡屏幕
We b网站和 IIS 5.0中目录的属性,这就定义了使用此站点或目录资源发送到客户机的所有请求的 H T T P报头,也就提供了使用每个网页中的
A S P脚本代码设置这些属性的替代方法。
在 We b站点或目录上右击鼠标并选择
,P r o p e r t i e s”,在其对话框的,HTTP Headers”
选项卡中,可设置页面内容有效期的相对时间或绝对日期,定义定制的报头,创建 P I C S内容等级标签,也可以通过 M I M E类型映射来定义内容类型,如图 2 - 2 4所示。
在图 2 - 2 4中,可以看到已创建了自定义的
REFRESH HTTP报头,应用于从此目录载入的所有网页。即每一分钟自动地重载 (刷新 )一次
(对于显示棒球比赛的最新比分是非常理想的,
但对服务器而言负担太重了 )。 Custom HTTP
H e a d e r s栏的 E d i t对话框如图 2 - 2 5所示。
要在,MIME Map”框中添加自定义的内容类型映射,只需在,P r o p e r t i e s”主对话框中单击,File Ty p e s”按钮把它们添加到清单中即可,如图 2 - 2 6所示。
当使用 H T T P报头开始试验时,你很快会发现不是所有的浏览器表现都相同,
许多浏览器以不同的方式响应不同的
H T T P报头,使得可靠地建立一个普遍适用的原则有时极为困难。
2.5.3 使用客户证书假如设立了一个安全的 We b网站或部分内容具有安全机制的网站,可安装一个数字服务器证书,通过允许访问者使用证书中的加密的细节,来验证服务器。每一次对该站点或目录的页面请求,服务器都将发送证书的一个副本,浏览器可检查这个副本以确定正在和谁交谈。
同样,也可设置服务器,要求用户在进入网站时提供一个有效的数字证书。他们可从很多来源获得此证书,例如 Ve r i s i g n ( h t t p,/ / w w w,v e r i s i g n,c o m )或 Thawte Consulting(http://
w w w,t h a w t e,c o m )。读者将在第 2 5章看到这一处理过程的细节。
这些情况都使用了 R e q u e s t对象的 C l i e n t C e r t i f i c a t e集合的值,本章的实例代码中,已包含了一个显示用户如何使用此集合值的一些方法的页面。
在 Request Object主页面 ( s h o w _ r e q u e s t,a s p )中单击 C l i e n t C e r t i f i c a t e E x a m p l e,则打开 U s i n g
the Request Collection菜单。在此页面中,选择 Viewing the ClientCertificate Collection链接,
打开显示随同页面请求发往服务器的客户证书的内容的页面。
这一网页被命名为 s h o w c e r t,a s p,而且其所做的一切就是遍历 C l i e n t C e r t i f i c a t e集合显示其包含的所有值。可使用以前经常使用的简单代码来完成它,唯一的不同之处就是建立一个第 2章 请求和响应的处理 计计 65下载图 2-25 Custom HTTP Headers栏的 E d i t对话框图 2-26 添加内容类型映射的屏幕
H T M L表以容纳结果,并将其截为每 6 0个字符一组。
运行结果如图 2 - 2 7所示。
图 2-27 运行结果屏幕然而,要在自己系统上得到结果,必须建立一个安全的网站或目录。
使用客户证书重定向一旦要求所有访问网站或部分网站的浏览者给出的其客户证书,就可以使用其包含的信息来制作我们为此用户创建的网页。例如,可使用他们的证书的 O rg a n i z a t i o n条目来自动使他们重定向到该网站的指定部分,使别的访问者重定向到别的地方:
相应地,可使用 C o u n t r y条目来使访问者重定向到一个相应的网站:
66计计 ASP 3 高级编程 下载
2.5.4 读写二进制数据有两个方法提供了对从浏览器发送到服务器的 H T T P数据流和从服务器返回到浏览器的数据流的二进制数据访问。 R e q u e s t,B i n a r y R e a d方法可得到指定要读取的字节数的参数,并返回变体类型的数组,其中包含从请求的 P O S T段中得到的字节 (例如在 A S P的 F o r m集合中数据 )。
下面的程序读数据的头 6 4个字节:
假如使用了 B i n a r y R e a d方法,以后就不能访问 ASP 的 R e q u e s t,F o r m集合。同样,一旦我们采用任何方式引用了 R e q u e s t,F o r m集合,就不能使用 B i n a r y R e a d方法。
把二进制数据写进 A S P创建的响应流中也是可能的,可采用 B i n a r y Wr i t e方法。需要给其提供想写到客户的字节的变体类型数组:
这些方法都很少使用,除非从一个数据库创建非 H T M L源才用到这些方法。使用的一个实例就是从数据库读取组成图像的字节,并使用 B i n a r y Wr i t e方法把它发送到客户。
2.5.5 创建定制的日志消息假如设置了服务器,以 W3C Extended Log File Format格式将请求记录到一个文本文件,
可使用 R e s p o n s e,A p p e n d To L o g方法在日志文件条目的结尾处添加一条消息字符串。若想为特定的网页存储一些值或消息,或在脚本中出现了特定的情况时,这种方式是非常有用的。
例如,通过的 I n t r a n e t的,stationary order”应用程序,可以记录超过特定的条目数目的雇员的部门号码:
设置扩展的日志要使用 A p p e n d To L o g方法,必须激活 W3C Extended Log File Format日志设置。该设置方法是,进入 P r o p e r t i e s对话框中的 Web Site选项卡,选中 Enable Logging复选框,选择 W 3 C
Extended Log File Format并单击 P r o p e r t i e s按钮,如图 2 - 2 8所示。
在出现的 Extended Logging Properties对话框中,可选择想包括进日志文件的条目。确保选中 URI Stem,否则 A p p e n d To L o g方法将失败,如图 2 - 2 9所示。
我们提供了一个试图在日志文件中写入一个条目的简单实例页面,可从 Request Object主页 ( s h o w _ r e q u e s t,a s p )中的 A p p e n d ToLo g方法链接处打开它。这一页面所做的全部工作就是创建一个包含当前日期和时间的简单字符串,然后执行 A p p e n d To L o g方法:
结果如图 2 - 3 0所示。
第 2章 请求和响应的处理 计计 67下载图 2-28 设置 We b站点日志的屏幕图 2-29 选择要放进日志文件的条目图 2-30 执行 A p p e n d To L o g方法后的屏幕
68计计 ASP 3 高级编程 下载
2.6 小 结本章已经开始了对 ASP 3.0的研究,而且我们也看到了 ASP 3.0如何与 Internet Information
Server 5.0共同工作,以提供一个易用的、高效的创建动态 We b网页和 We b应用程序的方法。
当然,仍有一些地方需要去研究,本章仅仅是学习了 A S P内置的两个最基本的对象。
这两个最基本的对象是 R e q u e s t和 R e s p o n s e对象,允许我们访问和使用作为客户机/服务器会话一部分的值,无论用户何时从 We b网站请求和载入一个网页或资源,这种会话就会进行,意味着 R e q u e s t对象能够提供对用户请求的全部内容的访问,同时 R e s p o n s e对象允许创建和修改服务器发回的响应。
这些对象能够通过集合和属性揭示会话的各个部分,并提供了多个能用来检索和修改各段的方法。假如把它们当作分解用户请求和使用相应的内容创建响应的工具,这有助你理解究竟发生了什么。这也将有助于理解各种方法如何影响客户、服务器和正在创建的网页。
本章我们讨论了下列内容:
客户和服务器如何相互作用来传递动态页面。
Request和 R e s p o n s e对象的细节以及它们的共同之处。
如何访问窗体和查询字符串的值。
如何读取和创建保存在客户上的 c o o k i e。
什么是服务器变量,如何访问和修改 H T T P报头。
其他一些项目的细节,例如客户机证书。
这些只是一些使网站能够发出动态网页的基本知识,仍然有许多未知的内容需要进一步了解,随着贯穿本书的这些对象的使用,读者将越来越清楚其中的内容,同时将继续探索
A S P的扩展能力及其精华。下一章将讨论用户会话和应用程序以及相应的两个 A S P对象。
第 2章 请求和响应的处理 计计 69下载