CGI是Common Gateway Interface的縮寫,翻譯成中文就是通用網關接口,它是網頁的後臺處理程序,運行在服務器端上,可以用多種語言書寫,最常用的就是Perl(因爲Perl有強大的字符串處理功能,而CGI程序經常要處理許多的字符串)。舉個例子來說,通常一般的論壇或郵箱等都需要註冊,需要用戶輸入用戶名和密碼,首先給你一個靜態的頁面,上面有兩個文本框,要求你輸入用戶名和密碼,還有一個提交和重置的按鈕,用於提交用戶的輸入,當用戶點擊提交按鈕時,這個請求就被髮送到服務器端,服務器上的CGI程序就會解析用戶的輸入,並且驗證用戶的輸入是否合法,是否被通過驗證等。下面看一個非常簡單的例子,代碼是最好的解說:
<html>
<head><title>用戶登陸驗證</title></head>
<body>
<form name="form1" action="/cgi-bin/output.cgi" method="POST">
<table align="center">
<tr><td align="center" colspan="2"></td></tr>
<tr>
<td align="right">用戶名</td>
<td><input type="text" name="Username"></td>
</tr>
<tr>
<td align="right">密 碼</td>
<td><input type="password" name="Password"></td>
</tr>
<tr>
<td><input type="submit" value="登 錄"></td>
<td><input type="reset" value="取 消"></td>
</tr>
</table>
</form>
</body>
</html>
-------------------------以下是cgi處理程序的源碼----------------------------
/* output.c */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char* getcgidata(FILE* fp, char* requestmethod);
int main()
{
char *input;
char *req_method;
char name[64];
char pass[64];
int i = 0;
int j = 0;
// printf("Content-type: text/plain; charset=iso-8859-1/n/n");
printf("Content-type: text/html/n/n");
printf("The following is query reuslt:<br><br>");
req_method = getenv("REQUEST_METHOD");
input = getcgidata(stdin, req_method);
// 我們獲取的input字符串可能像如下的形式
// Username="admin"&Password="aaaaa"
// 其中"Username="和"&Password="都是固定的
// 而"admin"和"aaaaa"都是變化的,也是我們要獲取的
// 前面9個字符是UserName=
// 在"UserName="和"&"之間的是我們要取出來的用戶名
for ( i = 9; i < (int)strlen(input); i++ )
{
if ( input[i] == '&' )
{
name[j] = '/0';
break;
}
name[j++] = input[i];
}
// 前面9個字符 + "&Password="10個字符 + Username的字符數
// 是我們不要的,故省略掉,不拷貝
for ( i = 19 + strlen(name), j = 0; i < (int)strlen(input); i++ )
{
pass[j++] = input[i];
}
pass[j] = '/0';
printf("Your Username is %s<br>Your Password is %s<br> /n", name, pass);
return 0;
}
char* getcgidata(FILE* fp, char* requestmethod)
{
char* input;
int len;
int size = 1024;
int i = 0;
if (!strcmp(requestmethod, "GET"))
{
input = getenv("QUERY_STRING");
return input;
}
else if (!strcmp(requestmethod, "POST"))
{
len = atoi(getenv("CONTENT_LENGTH"));
input = (char*)malloc(sizeof(char)*(size + 1));
if (len == 0)
{
input[0] = '/0';
return input;
}
while(1)
{
input[i] = (char)fgetc(fp);
if (i == size)
{
input[i+1] = '/0';
return input;
}
--len;
if (feof(fp) || (!(len)))
{
i++;
input[i] = '/0';
return input;
}
i++;
}
}
return NULL;
}
上面的第一個是一個靜態html頁面,要求用戶輸入用戶名和密碼,當戶輸入之後,點擊“登錄”按鈕,則用戶的輸入就被提交到服務器,由output.cgi來處理,在這裏,只是作爲一個演示,output.cgi把用戶的輸入顯示在頁面上。
操作提示:將第一段HTML代碼拷貝到一個文本文件,另存爲login.htm,注意擴展名要用htm或者html,第二段代碼是c語言源代碼,筆者在VC++6.0下編譯通過,生成文件爲output.exe,將其改名爲output.cgi,login.htm放在網站的目錄,output.cgi放在網站的cgi-bin目錄。筆者用的是Apache服務器,將login.htm放在了htdocs下面,將output.cgi放在了cgi-bin目錄。在瀏覽器輸入
http://127.0.0.1/login.htm
就會出現
用戶名 | |
密 碼 | |
這樣頁面,當用戶輸入了用戶名和密碼之後,點擊“登錄”按鈕,就會出現下面的頁面
The following is query reuslt:
Your Username is admin
Your Password is admin888
這裏我們假設在用戶名文本框裏輸入的是"admin",在密碼框裏輸入的是"admin888"。
需要說明是要在本機上運行該cgi程序,需要裝支持cgi的Web服務器,最常見的免費Web服務器就是apache,這個很容易下載到。安裝之後,基本不需要做任何的配置,把login.htm放在htdocs目錄下面,把output.cgi放在cgi-bin目錄下,啓動web服務器後,就可以解釋cgi程序了。
筆者也剛接觸,寫的很粗糙,如有不適之處,望廣大網友批評指正。
http://blogold.chinaunix.net/u/5391/showart_265981.html
版權聲明:本文爲博主原創文章,未經博主允許不得轉載。