版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
CGI一.根本原理CGI:通用網(wǎng)關(guān)接口〔CommonGatewayInterface〕Web效勞器主機供給信息效勞的標(biāo)準(zhǔn)接口。通過CGI接口,Web效勞器就能夠獵取客戶端提交的信息,轉(zhuǎn)交給效勞器CGI程序進(jìn)展處理,最終返回結(jié)果給客戶端。CGIhtml頁面,就是在用戶端掃瞄器上顯示的頁Cgi程序。它們之間的通訊方式如以下圖:效勞器效勞器客戶端通信標(biāo)準(zhǔn)輸入輸出〔環(huán)境變量〕CGI程序通信,我們只需要知道掃瞄器懇求執(zhí)行效勞器上哪個CGI程序就可以了,其他不必深究細(xì)節(jié),由于這些過程不需要程序員去操作。CGI程序之間的通訊才是我們關(guān)注的。一般狀況下,效勞器和CGI程序之間是通過標(biāo)準(zhǔn)輸入輸出來進(jìn)展數(shù)據(jù)傳遞的,而這個過程需要環(huán)境變量的協(xié)作方可實現(xiàn)。URL指向一個應(yīng)用程序效勞器為應(yīng)用程序執(zhí)行做預(yù)備應(yīng)用程序執(zhí)行,讀取標(biāo)準(zhǔn)輸入和有關(guān)環(huán)境變量應(yīng)用程序進(jìn)展標(biāo)準(zhǔn)輸出Windowsprofile文件進(jìn)展數(shù)據(jù)傳輸〔ini文件〕,但在這里不做爭論。CGICGI程序只能處理一個用戶懇求,所以在激CGI程序進(jìn)程時也創(chuàng)立了屬于該進(jìn)程的環(huán)境變量。二.環(huán)境變量CGI程序來說,它繼承了系統(tǒng)的環(huán)境變量。CGICGI程序啟動時初始化,在完畢時銷毀。當(dāng)一個CGI程序不是被CGI戶端、CGI傳輸過程等工程。與懇求相關(guān)的環(huán)境變量 REQUEST_METHODQUERY_STRINGCONTENT_LENGTHCONTENT_TYPECONTENT_FILEPATH_INFOPATH_TRANSLATEDSCRIPT_NAME與效勞器相關(guān)的環(huán)境變量 GATEWAY_INTERFACESERVER_NAMESERVER_PORTSERVER_SOFTWARE與客戶端相關(guān)的環(huán)境變量 REMOTE_ADDRREMOTE_HOSTACCEPTACCEPT_ENCODINGACCEPT_LANGUAGEAUTORIZATIONFORMIF_MODIFIED_SINGCEPRAGMAREFFERERUSER_AGENT
CGI程序之間的信息傳輸方式GET時所傳輸?shù)男畔TDIO中的有效信息長度指示所傳來的信息的MIME類型Windowsd/WinCGI傳送數(shù)據(jù)的文件名路徑信息CGI程序的完整路徑名所CGI程序的名字效勞CGI版本IP或名字主機的端口號CGI效勞器的名稱和版本號客戶機的主機名IP地址例出能被次懇求承受的應(yīng)答方式列出客戶機支持的編碼方式ISO代碼說明被證明白的用戶EMAIL地址get方式懇求并且只有當(dāng)文檔比指定日期更早時才返回數(shù)據(jù)設(shè)定將來要用到的效勞器代理指出連接到當(dāng)前文檔的文檔的URL客戶端掃瞄器的信息CONTENT_TYPE:application/x-www-form-urlencodedHTML表單,URL編碼。ACCEPTMIME類型清單,內(nèi)容如:image/gif,image/jpeg”REQUEST_METHOD:它的值一般包括兩種:POSTGETCGI程序時,最終還要考慮其他的狀況。POST方法POSTCGICONTENT_LENGTHPOST方式發(fā)送數(shù)據(jù)有一個相應(yīng)的MIME類型〔通用Internet郵件擴充效勞:Multi-purposeInternetMailExtensions〕。目前,MIME類型一般是:application/x-wwww-form-urlencoded,該類型表HTMLCONTENT_TYPE中,CGI程序應(yīng)當(dāng)檢查該變量的值。GET方法在該方法下,CGI程序無法直接從效勞器的標(biāo)準(zhǔn)輸入中獵取數(shù)據(jù),由于效勞器把它從標(biāo)QUERY_STRING〔PATH_INFO〕。GETPOSTGETHTML表單數(shù)據(jù)的時候,客戶機將把這些數(shù)ACTIONURLURLCGI程序的名字分開:“://mycorp/hello.html“://mycorp/hello.html?name=hgq$id=1,QUERY_STRINGname=hgq&id=1GETURL的末尾有URL的動身點:URL作為一種標(biāo)準(zhǔn)用語,一般是用作網(wǎng)絡(luò)資源的唯肯定位標(biāo)示。環(huán)境變量是一個保存用戶信息的內(nèi)存區(qū)。當(dāng)客戶端的用戶通過掃瞄器發(fā)出CGI懇求時,CGICGI程序的同時,效勞器把該用戶的信息保存到環(huán)境變量里。接下來,CGICGI程序進(jìn)程相request_methodPOSTlen,然后到該進(jìn)程相應(yīng)的標(biāo)準(zhǔn)輸入取出len長的數(shù)據(jù)。假設(shè)是GETQUERY_STRING里。POSTGET的區(qū)分以GET方式接收的數(shù)據(jù)是有長度限制,而用POST方式接收的數(shù)據(jù)是沒有長度限制的。并且,以GET方式發(fā)送數(shù)據(jù),可以通過URL的形式來發(fā)送,但POST方式發(fā)送的數(shù)據(jù)必需要通過Form才到發(fā)送。三.CGI程序?qū)崿F(xiàn)步驟從效勞器獵取數(shù)據(jù)C語言實現(xiàn)代碼:#include#include<stdio.h>#include<stdlib.h>#include<string.h>intget_inputs{intlength;char*method;char*inputstring;method=getenv(“REQUEST_METHOD”);//將返回結(jié)果賜予指針if(method==NULL)return1; //找不到環(huán)境變量REQUEST_METHODif(!strcmp(method,”POST”)) //POST方法{length=atoi(getenv(“CONTENT_LENGTH”));//結(jié)果是字符,需要轉(zhuǎn)換if(length!=0){inputstring=malloc(sizeof(char)*length+1)//stdin是不帶緩存的。fread(inputstring,sizeof(char),length,stdin);//從標(biāo)準(zhǔn)輸入讀取肯定數(shù)據(jù)}}elseif(!strcmp(method,“GET”)){Inputstring=getenv(“QUERY_STRING”);length=strlen(inputstring);}if(length==0)return0;}$method=$method=$ENV{?REQUEST_METHOD?};if($methodeq?POST?){Read(STDIN,$input,$ENV{?CONTENT_LENGTH?});}if($methodeq?GET?||$methodeq?HEAD?){$input=$ENV{?QUERY_STRING?};}if($inputeq“”){&print_form;exit;}#!/usr/local/bin/pythonimport#!/usr/local/bin/pythonimportcgidefmain:form=cgi.FieldStoragePython代碼實現(xiàn)更簡潔,cgi.FieldStoragekey就是變量名,key對應(yīng)的值就是變量名的值,更本無需用戶再去進(jìn)展數(shù)據(jù)解碼!獵取環(huán)境變量的時候,假設(shè)先推斷“REQUEST_METHOD”是否存在,程序會更強健,否則在某些狀況下可能會造成程序崩潰。由于假設(shè)CGI程序不是由效勞器調(diào)用的,那么環(huán)CGI相關(guān)的環(huán)境變量〔REQUEST_METHOD,REMOTE_ADDR等〕添加進(jìn)來,也就是說“getenv(“REQUEST_METHOD”)NULL!URL編碼不管是POST還是GET方式,客戶端掃瞄器發(fā)送給效勞器的數(shù)據(jù)都不是原始的用戶數(shù)URLCGIContent_typeContent_type=application/x-www-form-urlencodeURLHTML表單變量數(shù)據(jù)。編碼的根本規(guī)章是:變量之間用“&”分開;=”連接;空格用“+”代替;保存的掌握字符則用“%16ASCII碼代替;%16ASCII碼代替;空格是非法字符;任意不行打印的ASCII掌握字符均為非法字符。例如,假設(shè)3HTMLfilename、e-mailcomments,它們的值對應(yīng)分別為hello、“mailto:mike@hotmail“mike@hotmailI?llbethereforyouURL編碼后應(yīng)為:filename=hello&e-mail=hello@hotmail&comments=I%27ll+be+there+for+youfilename=hello&e-mail=hello@hotmail&comments=I%27ll+be+there+for+you所以,CGI在解碼方面,PYTHON代碼實現(xiàn)是最抱負(fù)的,cgi.FieldStorage函數(shù)在獵取數(shù)據(jù)的同時Perl庫:cgi-lib.plPerl庫:cgi-lib.plReadParseURL解碼很簡潔:require?cgi-lib.pl?;&ReadParse(*input);CGI數(shù)據(jù)輸出CGICGI格式化輸出。CGI程序中的標(biāo)準(zhǔn)輸出stdout是經(jīng)過重定義了的,它并沒有在效勞器上產(chǎn)生任何的CPerlPython實現(xiàn)無關(guān)。HTML頁面的生成。比方,Cprintf是向該進(jìn)程的標(biāo)準(zhǔn)輸動身送數(shù)據(jù),PerlPythonprint向該進(jìn)程的標(biāo)準(zhǔn)輸動身送數(shù)據(jù)?!?〕CGI標(biāo)題CGI的格式輸出內(nèi)容必需組織成標(biāo)題/內(nèi)容的形式。CGICGI程序可以使用標(biāo)題。標(biāo)題必需占據(jù)第一行輸出!而且必需隨后帶有一個空行。標(biāo)題 描述Content_type (內(nèi)容類型)Location (地址)Status (狀態(tài))
MIME類型設(shè)定輸出為另外一個文檔〔URL〕狀態(tài)碼MIME:向標(biāo)準(zhǔn)輸動身送網(wǎng)頁內(nèi)容時要遵守MIME格式規(guī)章:任意輸出前面必需有一個用于定義MIME類型的輸出內(nèi)容〔Content-type〕行,而且隨〔同樣使用于其他標(biāo)題〕例如例如Perl和Python:print“Content-type:text/html\n\n”;print“<body>welcome<br>”print“</body>”//HTML格式的數(shù)據(jù)printf(“Content-type:text/html\n\nprintf(“Content-type:text/html\n\n”);printf(“Welcome\n”);MIME類型以類型/子類型〔type/subtype〕的形式表示。type表示一下幾種典型文件格式的一種:Text、Audio、Video、Image、Application、Mutipart、MessageSubtype則用來描述具體所用的數(shù)據(jù)格式。Application/mswordApplication/octet-streamApplication/zipApplication/pdf。。。。。。。。。。。。。
Word文件一種通用的二進(jìn)制文件格式Zip壓縮文件Pdf文件。。。。。。。。。。。。。Location:LocationCGI可以使當(dāng)前用戶轉(zhuǎn)而訪問同一效勞器上的另外一個程序,URL,但效勞器對他們的處理方式不一樣。Location的格式為:Location:Filename/URL,例如:printprint“Location:/test.html\n\n”;test.html的效果是一樣的。printprint““://chinaunix/\\n\\n“Location:://chinaunix/\n\n”由于該URL并不指向當(dāng)前效勞器,用戶掃瞄器并不會直接鏈接到指定的URL,而是給用戶輸出提示信息。狀態(tài)碼:表示了懇求的結(jié)果狀態(tài),是CGI程序通過效勞器用來通知用戶其懇求是否成功執(zhí)行的信息碼,本文不做爭論。四.CGI中的信號量和文件鎖CGI程序時公用的,而WEB效勞器都支持多進(jìn)程運行,因此可能會發(fā)生同時有多CGI2CGI程序,效勞2CGIABA首先翻開了某個文件,然后由于某種緣由被掛起〔一般是由于操作系統(tǒng)的進(jìn)程調(diào)度〕;而就在進(jìn)程A被掛起的這段時間內(nèi),進(jìn)程B完成了對文件的整個操作流程:翻開,寫入,關(guān)閉;進(jìn)程A再繼續(xù)往下執(zhí)行,但進(jìn)程A所操作的文件照舊是原來文件的就版本,此時進(jìn)程A的操作結(jié)果將B的操作結(jié)果。為了防止這種狀況發(fā)生,需要用到文件鎖或者信號量。鑰匙文件?HTMLCGICGI程序如何區(qū)分它們呢?INPUTCGI必需經(jīng)過一系列解碼后INPUT的變量和其值。CGIPerlCGI程序后綴為:.pl;PythonCGI程序后綴為:.pyC編寫CGI程序后綴為:.cgiwin下編譯出來的是.exe,最好將它重命名為.cgi。這些都效勞能夠識別并調(diào)用它們。appchedd.conf如下:AddHandlercgi-scriptAddHandlercgi-script.cgi.py.plCGIC語言庫——cgihtmlCgihtmlCCGI庫。它供給的功能函數(shù)如下:Read_cgi_inputHTML表單輸入,返回一個指向某構(gòu)造體的指針Cgi_val:獵取每個表單變量的值Html_header:HTML標(biāo)題欄Html_begin:HTML文檔的開頭局部H1:輸出一行字符,字體為H1Html_end:HTML文檔的結(jié)尾局部。#include“cgi-lib.h”#include“html-lib.h”#include“string-lib.h”六
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年武漢車都建設(shè)投資有限公司招聘筆試參考題庫含答案解析
- 2025年度電子產(chǎn)品分期購買與售后服務(wù)合同
- 2025年度人事代理與員工薪酬福利調(diào)整服務(wù)協(xié)議3篇
- 2025年高新技術(shù)企業(yè)授權(quán)合同簽訂委托書規(guī)范3篇
- 2025版新能源汽車租賃與智能交通控制系統(tǒng)合作框架協(xié)議3篇
- 2025年全球及中國垂直旋轉(zhuǎn)模塊行業(yè)頭部企業(yè)市場占有率及排名調(diào)研報告
- 2025年全球及中國TGV玻璃芯基材行業(yè)頭部企業(yè)市場占有率及排名調(diào)研報告
- 2025版城市更新項目土地使用權(quán)作價出資合作協(xié)議3篇
- 二零二五年度成都市二手房交易合同范本 正版官方規(guī)范修訂3篇
- 二零二五年度車隊運輸保險合作協(xié)議3篇
- 淺談提高中學(xué)生歷史學(xué)習(xí)興趣的策略
- 藥品儲存養(yǎng)護(hù)知識大全
- 新版藥品批發(fā)企業(yè)質(zhì)量管理體系文件大全
- 項目管理實施規(guī)劃-無錫萬象城
- 浙大一院之江院區(qū)就診指南
- 離婚協(xié)議書電子版下載
- 相似三角形判定專項練習(xí)30題(有答案)
- 2023學(xué)年完整公開課版mydreamjob作文教學(xué)
- 巴基斯坦介紹課件
- 農(nóng)村個人房屋抵押借款合同
- 中國周邊安全環(huán)境-中國人民大學(xué) 軍事理論課 相關(guān)課件
評論
0/150
提交評論