分类: LINUX
2014-04-02 17:09:36
CGI通用网关接口
1.CGI简介
CGI即为通用网关接口(Common Gateway Interface),它是一段程序,运行在服务器上,提供同客户端HTML页面的接口,通俗的讲CGI就像是一座桥,把网页和WEB服务器中的执行程序连接起来,它把HTML接收的指令传递给服务器,再把服务器执行的结果返还给HTML页;用CGI可以实现处理表格,数据库查询,发送电子邮件等许多操作,最常见的CGI程序就是计数器。CGI使网页变得不是静态的,而是交互式的。
2.CGI应用程序工作原理
1.浏览器通过HTML表单或者超链接请求连上一个CGI应用程序的URL。
2.服务器接收到请求。
3.服务器执行指定CGI应用程序。
4.CGI应用程序执行所需要的操作,通常是基于浏览器者的输入的内容。
5.CGI应用程序把结果格式化为网络服务器和浏览器能够理解的文档(通常是HTML网页)。
6.网络服务器把结果返回到浏览器中。
3. CGI依赖的服务器BOA
我们在项目中用到的服务器Boa,它是一个非常小巧的服务器,执行代码大约60KB左右。它是一个单任务的Web服务器,只能一次完成用户的请求,而不会fork出新的进程来处理并发的链接请求. 但是Boa支持Cgi,能够为Cgi程序fork出一个进程来执行相应的客户请求。
CGI程序使网页不再是静态的,而是具有交互功能。我们将做好的cgi程序放在BOA服务器www/cgi-bin里面,cgi程序不能跳出www文件夹取其他文件夹的资源。
在Boa服务器下以超文本和超媒体为技术,采用HTML、DIV+CSS等语言来写好所需要的网页,包括文字、图像、音乐等,然后客户端可以通过浏览器进行解析,从而浏览到网页的各种内容。 我们项目中做好的网页放在boa服务器的WWW文件里, 客户端浏览器对哪个网页有请求服务器就把页面发送给浏览器。
4. CGI程序与服务器BOA的交互原理
服务器和客户端之间的通信,是客户端的浏览器和服务器端的http服务器之间的HTTP通信,我们只需要知道浏览器请求执行服务器上哪个CGI程序就可以了,其他不必深究细节,因为这些过程不需要程序员去操作。
服务器和CGI程序之间的通讯才是我们关注的。一般情况下,服务器和CGI程序之间是通过标准输入输出来进行数据传递的,而这个过程需要环境变量的协作方可实现。
(1)服务器将URL指向一个应用程序(这个应用程序即Cgi程序 *.cgi)
(2)服务器为应用程序执行做准备
(3)应用程序执行,读取标准输入和有关环境变量
(4)应用程序进行标准输出
更通俗点讲,网页里面有个变量(环境变量),变量里面有个值, 通过某种方式把这个值传到cgi程序中, cgi程序中提取这个变量的值,根据这个值做出相应的处理;
在HTML中,当客户填写了表单,并按下了发送(submit)按钮后,表单的内容被发送到了服务器端,一般的,这时就需要有一个服务器端脚本来对表单的内容进行一些处理,或者是把它们保存起来,或者是按内容进行一些查询,或者是一些别的什么。没有了CGI,WEB的世界就完全失去了它的交互性,所有的信息都变成单向的了,而不能够有任何的反馈。
下图很好的展示了CGI程序的作用,CGI程序一方面将主进程执行的数据信息反馈到服务器送到浏览器上,同时HTML上的请求到达服务器后,CGI程序可以将请求解析到主程序中或者数据库中。
5.数据提交方式
在项目中我们大多以表单的形式提交数据信息,表单是html中的一个标签,也可以说是一个小组件。
表单有属于它自己的表单元素, 有输入框(单行/多行),单选按钮,多选按钮,下拉选项等,这些也叫表单项. 这些东西只要打开dreamweaver随便建个html就可以看到它的表单元素; 当你打开一个网页的时候,你输入的文字或者做出的选择,类似等等要提交信息的地方基本上都是属于表单元素; 这些表单元素(表单项)都必须放在表单内, 而整个表单在网页是看不到的,你可以理解它为一个容器,里面装着你要发给服务器的东西;
表单的提交过程,这是html中的一个代码段:
这里是表单内容
这里面的表单数据会被提交到指定URL(这个url可以是服务器上的一个cgi程序)
//type="submit" 是指提交表单
4、数据提交接受方式Get 和 post
上面那个代码段中 method中的get和post就是提交表单的两种方式;
两种表单提交方式之间的区别:
get方式:以URL字串本身传递数据参数,在服务器端可以从'QUERY_STRING'这个变量中直接读取,效率较高,但缺乏安全性,也无法来处理复杂的数据(只能是字符串,比如在servlet/jsp中就无法处理发挥java的比如vector之类的功能);
post方式:就传输方式讲参数会被打包在数据报中传输,从CONTENT_LENGTH这个环境变量中读取,便于传送较大一些的数据,同时因为不暴露数据在浏览器的地址栏中,安全性相对较高,但这样的处理效率会受到影响。
表单我们知道怎么提交了,那怎么提取表单中的数据呢?
比如下面这个表单:
当out.cgi收到请求时,需要把输入框”name”和输入框”number”内的值提取出来。而且不管form中的action是GET还是POST,都要有效。