资源预览内容
第1页 / 共62页
第2页 / 共62页
第3页 / 共62页
第4页 / 共62页
第5页 / 共62页
第6页 / 共62页
第7页 / 共62页
第8页 / 共62页
第9页 / 共62页
第10页 / 共62页
亲,该文档总共62页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
CGI和几种其它基本技术4CGI - Common Gateway Interface4Server Side Include (SSI)4Cookie4Server Push (和现在常听到的“推”技术不同)4Client Pull4服务器提供的文件访问权限的控制方式Common Gateway Interface (CGI)4让浏览器能启动服务器方程序的第一种技术 (和HTML的FORM标记一起).浏览器服务器 httpdHTTPCGIscript应用系统应用接口TCP/IPCGI4最初CGI指随HTML 2.0一起推出的一套使其它应用程序和HTTP服务器相互作用方式的规定.4随着Web服务器技术的发展,现在有时用CGI泛指所有用于httpd和服务器方其他程序模块相互作用的协议接口,包括servlet, LiveWire, ASP, WAI,etc.4我们这里讨论最初的形式. CGI脚本(script)4指存在于服务器方的,遵从CGI规定和服务器进行数据交换的一个程序。4由于CGI所规定的数据交换方式是基于操作系统基本服务的, CGI脚本可用任何语言编写。4CGI最大的用途是利用一个CGI脚本作为服务器和某个应用系统(例如数据库)的桥梁,使得浏览器方的用户能通过Web(即HTTP协议)使用该应用系统。这一部分的主要内容有:4FORM标记 - 浏览器收集用户信息的方式;4urlencoded - 浏览器发送给服务器数据的编码;4环境变量和标准输入 - 服务器向CGI脚本传送信息的手段;4动态网页 - CGI脚本生成并返回给服务器的结果(服务器然后将该网页送给浏览器).4Perl - 早期最好的CGI脚本编写语言FORM: HTML中的表格4 若干输入域 4属性有ACTION: 指出用于处理表格内容的程序METHOD: 指出表格数据传递给该程序的方法ENCTYPE: 指出表格信息的编码方式4输入域有3种类型,针对不同种类信息的收集: 各种性质,单行文字的输入: 选择性输入,弹出式或滚屏式菜单: 多行文字输入例子:arch./cgiforms/helloworld.htmlHello,World !CGI The first example of CGI programmingClick here to fire a script:#!/usr/bin/perlprint “Content-type:text/htmlnn”;print “ Some Title ”;print “Hello, World !”;过程与效果4visit arch.pku.cn/cgiforms/helloworld.html 4click “fire” button4html/cgi-bin中的helloword.pl得到执行4输出一个按HTTP应答格式准备的回答消息, 其中内容部分遵从HTML文本格式4服务器接过这个输出, 送给浏览器4浏览器显示内容INPUT域的性质, TYPE=?4文本: text, 纯文本内容, 进一步属性有NAME, MAXLENGTH,SIZE, VALUE.4口令: password, 用户输入内容不显示, 但传送不加密.4多选多(checkbox)和多选一类型(radio)NAME, VALUE, CHECKED (optional)同一组选项必须有相同的NAME例子:/cgiforms/tpcr.htmlAAABBBCCCTrueFalseINPUT域的性质, TYPE=?4隐藏: HIDDEN,不显示, 用来衔接相关的网页CGI程序可将获得的一个表格信息放到所产生网页表格的隐藏域中,从而建立起两张表格之间的联系4提交按钮: SUBMIT, 指示浏览器提交表格数据4复位按钮: RESET, 置表格初值, 即各输入域的VALUE值.4象素: IMAGE, 具有提交语义, 被点击象素坐标同时被提交.例子: hsri.htmlSELECT4属性, 除NAME外还有MULTIPLE: 可选多项 SIZE: 1为弹出菜单, 否则为滚屏式.4含有若干域, 有可选属性SELECTED: 初始预选 (缺省为第一项)VALUE: 选中后的返回值 (缺省为option元素所带的内容)例子 (size=3; size=3 multiple) aaaaaaaa bbbbbbbb cccccccc dddddddd eeeeeeee ffffffffTEXTAREA4初始内容4ROWS和COLS属性给出显示区域的大小4也有必须的NAME属性CS DEPT, PKU, BEIJING 100871, CHINA关于NAME属性4逻辑地看, 网页是一个由各种“元素”构成的一种层次式结构, 其本身就是一个元素.4这些元素由“tag”来标识. 许多tag都有NAME属性, 尤其是那些有比较丰富语义的元素.4我们将NAME看成是相应元素的“名字”. 名字是动态处理文档元素的依据.4CGI程序设计的一个常见错误是忘了写表格中元素的NAME属性. (浏览器不报错, 但也不给服务器送去相应的表格信息)application/x-www-form-urlencoded4繁杂的表格信息, 如何让CGI程序理解 ?4信息按在FORM中元素出现的顺序收集成一个编码的字符串.空格由“+”表示其它非数值字母字符由“%HH”表示, 16进制ASCII码. (例如回车换行是“%0D%0A”,! 被编码为%3D,等.)各属性名和属性值用“=”分开.“&”用来分隔不同的“名=值”name=Js+Frank&phone=%28315%2944317984考虑CGI程序收到了一个urlencoded字符串, 对应一个复杂的FORM输入(三种类型, INPUT类型还可能有不同的TYPE等等). 如何解析出其中的内容?4前提: CGI程序的设计者了解FORM的设计, 即他知道表格中不同元素的次序和名字.4对每一个输入域, 基本表示是“name=value”. 其中name是属性NAME对应的值; value是用户输入的内容, 或者VALUE属性的值(对于那些选择性元素, 菜单等).4checkbox的名字可能出现多次4select名字对应的是option的值或者文字内容4image名字带象素坐标, name.x=, name.y=METHOD=GET4GET,通常适合于用于信息查询的表格,例如查是否存在某本书.特点是信息量较小,不改变服务器方的状态.4服务器方的QUERY_STRING环境变量将含有按urlencoded方式编码的表格信息.4对浏览器来说,它将ACTION对应的URL和“?表格信息”拼接,形成URI,用于和服务器联系.4这也使得我们可能直接启动服务器方的一个程序,不一定通过表格. 例子Type your first name Type your last name 如果用户键入 “Winona” 和 “Ryder” 作为值, 则HTTP请求中的URI为 name.pl?First+Name=Winona&Last+Name=Ryder服务器方环境变量 QUERY_STRING将含有: “First+Name=Winona&Last+Name=Ryder“如果不用表格4可以通过如下方式启动程序和传送数据4http:/name.pl?First+Name=Winona&Last+Name=Ryder4完成同样的事情其他环境变量4CGI程序可以使用的典型环境变量有:GATEWAY_INTERFACE REMOTE_HOSTSERVER_NAME REMOTE_ADDRSERVER_SOFTWARE AUTH_TYPESERVER_PROTOCOL REMOTE_USERSERVER_PORT REMOTE_IDENTREQUEST_METHOD CONTENT_TYPEPATH_INFO CONTENT_LENGTHPATH_TRANSLATED HTTP_FROMSCRIPT_NAME HTTP_ACCEPTDOCUMENT_ROOT HTTP_USER_AGENT (browser)QUERY_STRING HTTP_COOKIE4例如Perl语句$ENVREMOTE_ADDR将返回浏览器所在计算机的IP地址。METHOD=POST4浏览器执行一个HTTP POST过程(将表格数据作为一个message送给服务器,而不是挂在URL后面)4服务器将收集的数据通过STDIN传递给CGI脚本。4环境变量CONTENT_LENGTH为从浏览器发送来的数据的字符数,变量CONTENT_TYPE被设为 application/x-www-form-urlencoded.CGI程序4根据METHOD,用对应方式获得编码后的表格信息4“解码”,从中取得纯表格信息4根据服务逻辑分析处理信息4生成返回网页,送给标准输出.4CGI程序必须产生一个响应 - 就算没有数据需要发回,CGI 程序也必须发一个错误或者空消息,因为 http连接这时仍然处于打开状态,必须由服务器关闭。CGI程序将给服务器发送一个头:如果头的类型是 “Location”,服务器将向客户发送指定的文件.如果头的类型是 “Content-type”, 服务器将把紧跟着的所有数据发送回浏览器。这应该是一个HTML文本。当 CGI 程序结束时,服务器关闭连接. 例子:一个最简单的CGI 程序#!/usr/bin/perlprint “Content-type: text/htmlnn”;print “The Hello, World example pagen”;print “Hello, World!n”;服务器返回的响应头标HTTP/1.0 200 OKDate: Sun,04 Feb 1997 01:51:49 GMTServer: Apache/1.0.2Content-type:text/htmlContent-length:98Last-modified: Thu,01 Feb 1996 02:22:09 GMTThe Hello, World example pageHello,World!CGI程序的输出4CGI 程序中所有对STDOUT的输出都交由服务器处理。输出应当以下列三种形式之一的头(header)开始:Location: 服务器发送另一个文件给客户 (并且结束连接).如: Location: http:/www.some.box.com/the_other_file.html;Status: 服务器将返回一个状态消息给客户 (并且结束连接).如: Status: 305 Document movedn;Content-type: 服务器将发送所有剩余的输出给浏览器(在一个空行之后),程序结束后才关闭连接.如 Content-type:text/htmlnn;CGI程序的位置4在HTTP服务器的配置文件中设定(或由扩展名决定).通常,在你编制CGI程序的服务器上,把含有表格的HTML文本放在服务器的“文档根目录”(“document root”)下的某个子目录中, 把CGI程序放在服务器的 “cgi-bin”目录下. 4CGI 程序必须有适当的权限,以便服务器执行. 另外, 如果 CGI 程序要读写其它文件,服务器必须具有相应的权限。(例如Apache服务器,CGI脚本要和httpd程序是同样的owner才能进行写磁盘操作。)Perl - 早期最好的CGI脚本编写语言4Practical Extraction and Report Language4Larry Wall,Programming Perl,OReilly.4Interpreted language, 层次介于C和shell script之间,free interpreter, first developed for UNIX, now Windows also4many on line materials and documents4“It is a language to help you to get the job done before your boss fire you.”4极强的字符串匹配和文本处理能力。Perl 最有用的功能4关联数组,数组大小的自动调节4二进制数转换功能4正则表达式4文件I/O功能4格式化功能4包括C的全部运算符,增加了字符串比较等运算符4表处理功能,支持堆栈、队列及其它表数据类型4丰富的语句类型和控制结构例:4下面的用Perl写的CGI程序将返回GET方法下,浏览器送给服务器的urlencoded表格信息:4#!/usr/bin/perlprint“Content-type:text/htmlnn”;print “$ENVQUERY_STRINGn“;Highlights of Perl: towards an important program4variablesscalar: 用$开始的标识符, 如$I, $name等. 一个scalar变量能放一个数或一个字符串.list: 一维线性表, 用开始的标识符, 如I, names. 用$names0,$names1等表示其中的元素. $#I指示I的最后一个元素下标. associated array: 相联数组,用%开始的标识符, 如%weekdays.其中的每一项是一对值,其中第一个称为key, 用来引出第二个值, 例如$weekdaysWen数据类型及应用举例4Perl支持两类数据类型:数值和字符串4支持布尔值的概念(值=0 认为是true)4$age=35;$name=“Bob”;4days=(Sun, Mon,Tue, Wed, Thu, Fri, Sat)print days #SunMonTueWedThuFriSatprint ($days4) #Thuweekdays=days1.5 #Mon.Fri4For ($i=$;$i=$#staff;$i+) print $staff$i;关联数组应用举例4关联数组可以用任意值作为下标,与数组不同。4%array=key1,value1,key2,value24$ageBob =35;$ageMary= 25;print agesBob,Mary; #35,25print keys(%age); #Bob,Maryfor $name(keys(%age)print “$name is $age$keysn”;正则表达式(regular expression)4处理字符串的一种模式(pattern),格式/pattern/4常见用法:. ,x?, x*, .* x+, .+,m,m,n,m,0-9,a-z,abc,a|b|c,4/perl/ 查找含有perl的字符串/perl/ /cg2,4/Highlights of Perl (cont)4例如%ENV是系统提供的一个环境变量相连数组, $ENVQUERY_STRING返回环境变量QUERY_STRING的值.4$_是一个非常特别的变量, 有些操作会不声不响地影响它的值, 有些操作还会缺省地用到它的值.Highlights of Perl (cont)4pattern matching and substitution, 以正则表达式为基础的操作. 匹配: /pattern/, $string=/pattern/, 返回逻辑值替换: s/pattern1/pattern2/, $string=s/pattern1/pattern2/, 用pattern2替换pattern1Highlights of Perl (cont)4string partition and joiningsplit(/pattern/,string), 按照pattern将string分开,返回一个list.例如,x = split(/&/,string)join(/pattern/,list),将list中的项用pattern分割拼接起来.例如,$x=join(/ /,x)4注意, $x, x, $x2的不同含义The important program in Perl: 从urlencoded 中析取信息# 首先搞清楚所用的METHODif($ENVREQUEST_METHOD eq “GET”) $in = $ENVQUERY_STRING;elsif ($ENVREQUEST_METHOD eq “POST”) for ($I=0; $I$ENVCONTENT_LENGTH; $I+)$in .= getc; #从标准输入中一个个字符读进来,拼接放到$in中.从urlencoded中析取信息(cont)in = split(/&/,$in); #按name=value对分开foreach $I (0.$#in) $in$I = s/+/ /g; # 将所有+转换为空格 $in$I = s/%(.)/pack(“c”,hex($1)/ge; # 上面是将16进制数转换为相应字符, e指示第二pattern为expr $loc = index($in$I,”=”); # 分开名和值 $name = substr($in$I,0,$loc); $val = substr($in$I,$loc+1); #下面用一个相联数组将结果装起来 $in$name .= 0 if (defined($in$key); #上面是针对checkbox和多重select $in$name .= $val;获取用户的输入数据4#! Usr/bin/perlprint “Content-type:/text/htmlnn”if ($ENVREQUEST_METHOD eq “POST”) read(STDIN,$buffer,$ENVCONTENT_LENGTH);elseif ($ ENVREQUEST_METHOD eq “GET”) $buffer=$ENVQUERY_STRING;4问题:编写CGI程序,如何列出全部的环境变量?输出所有环境变量4 foreach $key(keys (%ENV) print $key = $ENV($key) ;HTML文档的保护(以Apache服务器为例)4两个基本问题Authentication: Who are you ?I am lxm (proved by password)Im from 162.105.181.215 (ensured by Internet)Authorization: Can you access this document ?需要authentication作基础4可以将服务器所管辖的文档和潜在浏览者之间的关系看成是一个bipartite graph.文档的保护 (cont)4web文档保护的几个考虑因素级别或者类型, 例如Basic或Digest,不同的加密方式.文档集合的划分. 不同的文件可能有不同的保护要求, 显然也便于管理.用户也可能分成组, 不同的组可以有不同的访问权限. 用户组可以显式形成,也可以以IP地址为单位隐式形成.多重划分问题,不同的用户看到文档集合的划分可以不一样.4面向目录(以目录为单位管理)的控制是最自然的.访问控制文件(ACF)4全局的ACF通常是在服务器的配置目录中的access.conf.4在服务器所管理的网页空间中的任何子目录可以有一个局部ACF,命名为.htaccess。下面是Apache(也是NCSA)的ACF格式 (描述对一个目录的控制):在全局ACF中可对不同目录设置不同控制AuthType Basic 控制类型AuthName name of area给这一组文件起个名字AuthUserFile user-password path用户口令文件的位置AuthGroupFile group-file path用户组文件的位置, 组的概念只是为了方便例如GET, POST order list order of deny, allow directives 说明deny和allow的应用次序 deny from hosthost确定一个用户集合 allow from hosthost require entity-type entity作进一步限制解释4AuthGroupFile指定一个含用户组信息的文件,例如每一行为“组名:用户名表”。4require可设定哪些用户或组能访问该目录,有三种基本形式:require user uid uid require group grpid grpid require valid-user (集合内,通过认证者)4这里的uid和grpid分别从AuthUserFile和AuthGroupFile取出。deny,allow4分别指出不允许和允许哪些计算机访问该目录,参数可以是IP地址,也可以是域名。order指出应用deny和allow的次序。例如, order deny, allow deny from all allow from .pku.edu.cn将拒绝除.pku.edu.cn域下面的host外其它所有计算机的访问。下面是.htaccess文件的一个例子 AuthType Basic AuthName ClassList AuthUserFile /home/lxm/secret require user lxm chengxu cgz口令文件(AuthUserFile)4可以由htpasswd程序生成(通常服务器软件自带),它创建名为.htpasswd的口令文件。这个文件不应该放在公用区。其内容形如: Jack:FyXZ29pi73 lxm:Q44ti9cofks4为使子目录中的.htaccess生效,在全局的access.conf 中应有AllowOverride AuthConfig4这说明子目录中的访问控制设置将比全局设置有更高优先级。(AuthOverride None表示子目录中的设置将无效)。当用户访问有授权管制目录中的网页时,他将会首先看到类似于只有输入了有效的用户名和口令,才能继续。Server Push和Client Pull4两种初等的使网页有动态感的技术4Server Push: 服务器送出一种特殊Content-type的HTTP应答. 浏览器按一种特殊的方式显示这种应答. HTTP连接在整个过程中是保持的。较适合小文件,短时间间隔,例如小图像的动画.4Client Pull: 在网页中的一种特殊信息, 使得浏览器自动周期性的向服务器发出申请. 连接要每次重新获得。适合大文件,较长间隔,例如股票行情更新。server push4按HTTP的规定,Web服务器可以向浏览器返回一个“回答序列”,序列中的每个元素可以看作是一个独立的HTML文本,在浏览器方一个接一个显示,从而造成一种动态效果。这种序列用一种特殊的MIME类型,multipart/x-mixed-replaced,来说明。4通常,这种回答序列由一个CGI脚本产生,其输出需为如下基本结构:Content-type:multipart/x-mixed-replace;boundary=-DELIMIT -DELIMIT (第一张网页的内容,包括适当的Content-type和空行) -DELIMIT (第一张网页的内容,包括适当的Content-type和空行) 。 -DELIMIT-#!/usr/bin/perlprint Content-type:multipart/x-mixed-replace;boundary=-foonn;print n-foon;print Content-type:text/htmlnn;print From the first part ;print From the first part ;print From the first part ;print From the first part ;print From the first part ;print From the first part ;print n-foon;print Content-type:text/htmlnn;print From the second part n;print -foo-;Client Pull4服务器可以通过CGI脚本返回一种类型为“Refresh”的HTTP应答,或者在HTML文本的部分用标记模拟这种应答,从而使浏览器每隔一定时间自动发出一次新的网页请求。例如,Demo Client Pull Technology Insert your text or graphics here 4这将引起浏览器每隔5秒钟重新下载一次该网页。Client Pull (cont)4这里,比较有意义的一种应用是在META标记中用一个URL属性,从而使得浏览器通过本网页去自动取另一个网页。如果另一个网页也用这种技术,。,浏览器方将可以出现一种动态效果。例如,在doc1.html中有 。 。而在doc2.html中有则两张网页将每隔30秒钟交替显现。上面的META标记相当于HTTP回答中有 Refresh: 30; URL=http:/doc1.html的效果。利用隐藏域维持状态4典型的例子是“购物筐”。第一页收集顾客信息name, email, 以及要买那一类物品catalog.4第一页之后,CGI脚本产生一个购物目录页,含有关于顾客信息的隐藏域,另加一个“当前购物筐”隐藏域。这时表格中有5个域,其中item和catalog可见,name, email, currentbasket不可见,但其中的值来源于第一张网页。4每当顾客从当前购物类中选中一项,并选好下一购物类后,递交当前表格,CGI脚本就把所选的物品加到currentbasket中。如此多次,最后生成一个购物清单.The server www.lycos.com wishes to set a cookie that will be sent to any server in the domain .lycos.com. The name and value of the cookie are rf=aDo you wish to allow the cookie to be set?你见过类似于下面的“Web信息”吗?什么意思 ?利用Cookies维持状态4Cookie是服务器发送给浏览器的一种特殊形式的信息。浏览器不是将这些信息显示出来,而是记录在客户机的一个特定的文件中(例如Linux中用户目录下的.netscape/cookies)。当下次访问同样站点时,浏览器就有可能将该cookie信息送回给服务器。这样,就实现了浏览器和服务器之间某种持续的关系。4浏览器收到服务器方来的Set-Cookie文件头后就设置一个cookie, 一旦用户请求某个文件,满足Set-Cookie头中的参数要求时,浏览器将cookie发过去. 服务器将它放在HTTP_COOKIE环境变量中。这是比隐藏域更一般的一种技术。隐藏域技术只在一个session内有效,cookie技术可应用于不同的session之间。Cookie的建立4每个cookie由“键,值”对来定义。另外还可有一些可选参数定义cookie请求的有效性:expire,GMT时间,浏览器保持该cookie的时间限path,指定一个服务器方文档空间的子集,本cookie在其中有效domain,指定cookie在其中有效的网域.secure,这个参数指定cookie只能通过一个安全通道送出,例如SSL。如果不设任何参数,cookie将被返回给原来的服务器。服务器向浏览器送cookie的例子4#!/usr/bin/perlprint “Content-type:text/htmln”;print “Set-Cookie: gcf=friendn”;print “nn”;print “This is regular content n”;4访问这个脚本的浏览器(适当设置的)将会被问到是否接收一个cookie。获取回送的cookie4如果用户的请求符合cookie要求,浏览器将该cookie收集起来,发送给服务器,服务器将它们放在HTTP_COOKIE环境变量中供CGI脚本利用。例如#!/usr/bin/perl print “Content-type:text/htmlnn”;print “You send me cookie ”$ENVHTTP_COOKIE”n”;将返回浏览器送过来的cookie。服务器一次可以发送多个cookie给浏览器,每个带有不同的条件,如#!/usr/bin/perlprint “Content-type:text/htmln”;print “Set-Cookie:gcf=my friend;expires=Sat, 26-Aug-97 15:45:30 GMT; path=/projects; domain=cs.pku.edu.cnn”;print “Set-Cookie:don=my bossn”;print “nn”;当浏览器通过HTTP_COOKIE一次返回多个cookie时,之间用“;”分开.服务器方包含(Server Side Include)4SSI技术使服务器能够在发送网页的过程中在网页中动态插入数据. 这样的网页习惯上以.shtml作为文件扩展名(不必须),在服务器配置文件中设置.在srm.conf里: AddType text/html .shtmlAddHandler server-parsed .shtml在access.conf中还要指出含有.shtml文件的目录有”Includes”属性.4包含内容: 变量,文件,命令结果,程序结果.例子: ssi.htmlTest Server Side Include
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号