服务器|客户端
上一章介绍了安装设置的一些基本问题和A S P的使用,以及其所提供的内置对象。本章将进一步研究两个最常用的对象。在浏览器(或其他用户代理)和We b服务器之间,请求与响应中发生的信息交流可以通过ASP中的两个内置对象来进行访问和管理,这两个对象称为Request和Response对象。
在ASP页中所要进行的工作几乎都要访问这两个对象,使用这两个对象的方式将影响页面的效率及可靠性。当然,它们的主要用途是访问用户发回到服务器的值,即从HTML页的< FORM >段获得或附在URL后面作为查询字符串,并创建合适的输出返回给用户,且它们可以共享很多相同的因素。例如两个对象都可以使用存储在客户端计算机上的cookie。
因此,我们把本章分成两个独立的部分(每个对象一部分),并且首先从客户端与服务器之间的信息交流入手,然后再研究每一个对象。这将更有助于理解它们之间的关系及其重要性。
因此,本章研究的内容是:
客户端与服务器如何交流以传递Web页或其他资源。
Request和Response对象的细节,以及它们之间的共同点。
如何通过一个窗体和查询字符串访问相应的值。
如何读入或创建cookie并存放在客户端的计算机上。
服务器的变量是什么?如何访问和修改HTTP报头。
说明其他相关条目的变化,如客户的证书使用。
首先看一下客户浏览器(或“用户代理”)和ASP 的Web服务器之间交流的情况。
当浏览器或其他的用户代理访问Web站点请求页面时,在客户服务器和Web服务器之间就产生了一个对话,我们将仔细研究这个问题,因为理解这个问题有助于掌握使用ASP的Request和Response对象的基本知识,进而才能进一步掌握ASP的更多知识。
为节省篇幅,在本章及本书后面的内容中使用“浏览器”( browser )一词。但需要记住的是,能够访问Web页面的应用程序绝不仅只有浏览器,有许多特殊的应用程序从站点上下载网页,如为那些视力有缺陷用户设计的特殊的客户端程序或者是用通常的浏览器有其他困难的人。最显而易见的例子是搜索引擎用来访问Web上的站点的robot。全面考虑这些因素,包括普通的Web浏览器,准确的词汇应该是用户代理(user agent)。
页面请求的对话
当一个浏览器向We b站点提出页面请求时,显然必须告诉服务器,其请求的是哪一个页面。首先要做的是通过域名与服务器建立连接,然后提供所请求页面的全路径和名称。为什么要全路径和名称?Web是一个无国界的环境,所以必须创造一个会话标识每个客户(将在下一章介绍ASP如何做到这点)。
这就意味着每当服务器完成向客户发送页面后,服务器就彻底忘记了这个客户。因此,当客户请求下一个页面时,与一个新的访问者是完全相同的。服务器无法记住这个客户,相应的,也就无法判断它们上次请求的页面是哪一个。因此,不能使用相对路径来提供一个页
面,即使页面包含一个相对的链接也不行,例如:
浏览器将自动建立完整的新页面的URL,方法是使用当前页的域和路径;或使用页面< HEAD >段中的< BASE >元素,告诉浏览器一个页面中所有链接的基URL是什么。例如:
当把鼠标指向一个页面的链接时,可在浏览器的状态栏中看到如图2 - 1所示的情况。当前页面的路径和当前域名或基域名已经与请求的页面名结合在一起了。
1. 客户请求的细节
所请求页面的全路径和名称的组合是浏览器请求页面时发往服务器的唯一信息。浏览器的请求也能包含浏览器宿主的信息和客户端运行的操作系统。实际的信息内容将随着浏览器的不同而有相应的变化,只有很少一部分能够由其他的应用程序如搜索引擎robot提供。为了更清楚地了解该信息,下面是从IE 5.0 发出的一个对页面http://www.wrox.com/Store/Download.asp的请求信息:
从中可以看出,这些信息中有关于用户代理和用户连接的细节(如缺省的语言),也有能够接受的文件或应用程序的类型列表,这些都是MIME类型的,在后面将会见到更多。浏览器能够接受几种图像文件及多种Microsoft Office文件类型。“标准”的文件类型,如text/html和text/text没有列在其中。文件列表中*/*表示可向浏览器发回任何类型的文件,由浏览器解释或通过一个插件( plug-in )应用程序来进行解释。
cookie:条目包含的cookie存放在客户端的计算机上,并仅对该域有效。假如请求是点击链接的结果,而不是在浏览器的地址栏直接输入URL,则Referer:条目被显示,它包含了链接页面的完整的URL。
Host:条目包含客户计算机的IP地址或名称。然而,这还不足以准确辨别客户机。因为它们通过ISP连接时, IP地址是动态分配的,或者通过一个代理服务器连接时,IP地址是代理机的而不是实际的客户机的。
2. 服务器响应的细节信息
为响应上述的请求,并对匿名的浏览器(即用户不必提供用户名和访问口令)提供请求的页面,下面的内容是从服务器发往客户机的:
可以看出服务器向客户端说明自己所用的软件及版本,第一行表明所使用的是HTTP协议,及返回码的状态。信息“ 200 OK”表示请求被接受并得到了满足。后面的信息是被返回的页面的细节,包括MIME类型(Content-Length:)、大小(字节)、最近更改的时间,和返回客户端存储的cookie。响应中的其他信息是页面内容的信息流。
在某些情况下,服务器响应一个请求后,不能返回一个页面,也许因为页面不存在,或者客户没有相应权限来访问它。我们将在本书后续章节讨论安全问题。现在,对于请求页面不存在的情况(例如用户在浏览器的地址栏输入了错误的URL),返回的信息开头为:
这里,状态码和信息表明客户请求的页面无法找到。浏览器可使用这个信息向用户显示相应的信息(这种情况在IE 5.0中不显示服务器的响应信息,而显示相应“帮助性”的错误提示页面),也可显示服务器创建的缺省页面(依赖于服务器的设置)。
至此,我们已经看到了客户机与服务器交互作用中的一些细节,下面介绍ASP对象Request和Response如何把这些转换成相应的值。