Perl 简明教程
PERL and CGI Tutorial
What is CGI ?
通用网关接口或 CGI 是一组定义在 Web 服务器和自定义脚本之间如何交换信息的标准。
The Common Gateway Interface, or CGI, is a set of standards that define how information is exchanged between the web server and a custom script.
CGI 规范由 NCSA 维护,NCSA 对 CGI 的定义如下 −
The CGI specs are currently maintained by the NCSA and NCSA defines CGI is as follows −
通用网关接口 (CGI) 是外部网关程序与诸如 HTTP 服务器等信息服务器进行交互的标准。
The Common Gateway Interface, or CGI, is a standard for external gateway programs to interface with information servers such as HTTP servers.
当前版本为 CGI/1.1,CGI/1.2 正在进行中。
The current version is CGI/1.1 and CGI/1.2 is under progress.
Web Browsing
为了理解 CGI 的概念,让我们看看当我们点击超链接以浏览特定网页或 URL 时会发生什么。
To understand the concept of CGI, lets see what happens when we click a hyper link to browse a particular web page or URL.
-
Your browser contacts the HTTP web server and demand for the URL ie. filename.
-
Web Server will parse the URL and will look for the filename in if it finds that file then sends back to the browser otherwise sends an error message indicating that you have requested a wrong file.
-
Web browser takes response from web server and displays either the received file or error message.
但是,可以对 HTTP 服务器进行设置,以便在请求某个目录中的文件时不将该文件发回;而是将其作为程序执行,并将其程序输出发送回浏览器以供其显示。此功能称为网关接口或 CGI,而程序称为 CGI 脚本。这些 CGI 程序可以是 PERL 脚本、Shell 脚本、C 或 C++ 程序等。
However, it is possible to set up the HTTP server so that whenever a file in a certain directory is requested that file is not sent back; instead it is executed as a program, and whatever that program outputs is sent back for your browser to display. This function is called the Common Gateway Interface or CGI and the programs are called CGI scripts. These CGI programs can be a PERL Script, Shell Script, C or C++ program etc.
Web Server Support & Configuration
在继续进行 CGI 编程之前,请确保您的 Web 服务器支持 CGI 并且已配置为处理 CGI 程序。HTTP 服务器执行的所有 CGI 程序都保存在一个预先配置的目录中。此目录称为 CGI 目录,根据惯例将其命名为 /cgi-bin。惯例上,PERL CGI 文件的扩展名是 .cgi 。
Before you proceed with CGI Programming, make sure that your Web Server supports CGI and it is configured to handle CGI Programs. All the CGI Programs be executed by the HTTP server are kept in a pre-configured directory. This directory is called CGI Directory and by convention it is named as /cgi-bin. By convention PERL CGI files will have extention as .cgi.
First CGI Program
#!/usr/bin/perl
print "Content-type:text/html\r\n\r\n";
print '<html>';
print '<head>';
print '<title>Hello Word - First CGI Program</title>';
print '</head>';
print '<body>';
print '<h2>Hello Word! This is my first CGI program</h2>';
print '</body>';
print '</html>';
1;
HTTP Header
行 Content-type:text/html\r\n\r\n 是发送到浏览器的 HTTP 头的一部分,用于理解内容。所有 HTTP 头都将采用以下形式
The line Content-type:text/html\r\n\r\n is part of HTTP header which is sent to the browser to understand the content. All the HTTP header will be in the following form
HTTP Field Name: Field Content
例如
For Example
Content-type:text/html\r\n\r\n
在 CGI 编程中,您经常会用到其他一些重要的 HTTP 头。
There are few other important HTTP headers which you will use frequently in your CGI Programming.
S.No. |
Header & Description |
1 |
Content-type: String A MIME string defining the format of the file being returned. Example is Content-type:text/html |
2 |
Expires: Date String The date the information becomes invalid. This should be used by the browser to decide when a page needs to be refreshed. A valid date string should be in the format 01 Jan 1998 12:00:00 GMT. |
3 |
Location: URL String The URL that should be returned instead of the URL requested. You can use this filed to redirect a request to any file. |
4 |
Last-modified: String The date of last modification of the resource. |
5 |
Content-length: String The length, in bytes, of the data being returned. The browser uses this value to report the estimated download time for a file. |
6 |
Set-Cookie: String Set the cookie passed through the string |
CGI Environment Variables
所有 CGI 程序都将能够访问以下环境变量。这些变量在编写任何 CGI 程序时发挥着重要作用。
All the CGI program will have access to the following environment variables. These variables play an important role while writing any CGI program.
S.No. |
Variable Name & Description |
1 |
CONTENT_TYPE The data type of the content. Used when the client is sending attached content to the server. For example file upload etc. |
2 |
CONTENT_LENGTH The length of the query information. It’s available only for POST requests. |
3 |
HTTP_COOKIE Return the set cookies in the form of key & value pair. |
4 |
HTTP_USER_AGENT The User-Agent request-header field contains information about the user agent originating the request. Its name of the web browser. |
5 |
PATH_INFO The path for the CGI script. |
6 |
QUERY_STRING The URL-encoded information that is sent with GET method request. |
7 |
REMOTE_ADDR The IP address of the remote host making the request. This can be useful for logging or for authentication purpose. |
8 |
REMOTE_HOST The fully qualified name of the host making the request. If this information is not available then REMOTE_ADDR can be used to get IR address. |
9 |
REQUEST_METHOD The method used to make the request. The most common methods are GET and POST. |
10 |
SCRIPT_FILENAME The full path to the CGI script. |
11 |
SCRIPT_NAME The name of the CGI script. |
12 |
SERVER_NAME The server’s hostname or IP Address. |
13 |
SERVER_SOFTWARE The name and version of the software the server is running. |
#!/usr/bin/perl
print "Content-type: text/html\n\n";
print "<font size=+1>Environment</font>\n";
foreach (sort keys %ENV) {
print "<b>$_</b>: $ENV{$_}<br>\n";
}
1;
Output
Environment CONTEXT_DOCUMENT_ROOT:
CONTEXT_PREFIX:
DOCUMENT_ROOT:
GATEWAY_INTERFACE:
GEOIP_ADDR:
GEOIP_CONTINENT_CODE:
GEOIP_COUNTRY_CODE:
GEOIP_COUNTRY_NAME:
HTTP_ACCEPT:
HTTP_ACCEPT_ENCODING:
HTTP_ACCEPT_LANGUAGE:
HTTP_COOKIE:
HTTP_HOST:
HTTP_UPGRADE_INSECURE_REQUESTS:
HTTP_USER_AGENT:
HTTP_VIA:
HTTP_X_FORWARDED_FOR:
HTTP_X_FORWARDED_PROTO:
HTTP_X_HOST:
PATH:
QUERY_STRING:
REMOTE_ADDR:
REMOTE_PORT:
REQUEST_METHOD:
REQUEST_SCHEME:
REQUEST_URI:
SCRIPT_FILENAME:
SCRIPT_NAME:
SCRIPT_URI:
SCRIPT_URL:
SERVER_ADDR:
SERVER_ADMIN:
SERVER_NAME:
SERVER_PORT:
SERVER_PROTOCOL:
SERVER_SIGNATURE:
SERVER_SOFTWARE:
UNIQUE_ID:
How To Raise a "File Download" Dialog Box ?
有时候,你会希望提供一个选项,用户点击链接后将会为用户弹出“文件下载”对话框,而不是显示实际内容。这非常容易,可以通过 HTTP 标头实现。
Sometime it is desired that you want to give option where a use will click a link and it will pop up a "File Download" dialogue box to the user in stead of displaying actual content. This is very easy and will be achived through HTTP header.
此 HTTP 标头将与上一部分提到的标头不同。
This HTTP header will be different from the header mentioned in previous section.
例如,如果你想让用户可以通过给定的链接下载一个 FileName 文件,那么它的语法如下。
For example,if you want make a FileName file downloadable from a given link then its syntax will be as follows.
#!/usr/bin/perl
# HTTP Header
print "Content-Type:application/octet-stream; name=\"FileName\"\r\n";
print "Content-Disposition: attachment; filename=\"FileName\"\r\n\n";
# Actual File Content will go hear.
open( FILE, "<FileName" );
while(read(FILE, $buffer, 100) ) {
print("$buffer");
}
GET and POST Methods
你一定遇到过许多需要将某些信息从浏览器传递到网络服务器,最终再传递到 CGI 程序的情况。浏览器最常采用两种方法将此信息传递给网络服务器。这些方法是 GET 方法和 POST 方法。
You must have come across many situations when you need to pass some information from your browser to web server and ultimately to your CGI Program. Most frequently browser uses two methods two pass this information to web server. These methods are GET Method and POST Method.
Passing Information using GET method
GET 方法将编码的用户信息附加到页面请求中发送。页面和编码后信息通过 ? 字符分隔,如下所示 − http://www.test.com/cgi-bin/hello.cgi?key1=value1&key2=value2
The GET method sends the encoded user information appended to the page request. The page and the encoded information are separated by the ? character as follows − http://www.test.com/cgi-bin/hello.cgi?key1=value1&key2=value2
GET 方法是将信息从浏览器传递到网络服务器的默认方法,它会在浏览器的地址栏中生成一个长字符串。如果需要将密码或其他敏感信息传递到服务器,请不要使用 GET 方法。GET 方法有大小限制:请求字符串中只能有 1024 个字符。
The GET method is the defualt method to pass information from browser to web server and it produces a long string that appears in your browser’s Location:box. Never use the GET method if you have password or other sensitive information to pass to the server. The GET method has size limtation: only 1024 characters can be in a request string.
此信息使用 QUERY_STRING 标头传递,并且可以通过 QUERY_STRING 环境变量在 CGI 程序中访问。
This information is passed using QUERY_STRING header and will be accessible in your CGI Program through QUERY_STRING environment variable.
您可以通过简单地连接键和值对以及任意 URL 来传递信息,或者可以使用 HTML <FORM> 标记使用 GET 方法传递信息。
You can pass information by simply concatenating key and value pairs along with any URL or you can use HTML <FORM> tags to pass information using GET method.
Simple URL Example : Get Method
下面是一个简单的 URL,它将两个值传递给 hello_get.cgi 程序,并使用 GET 方法。
Here is a simple URL which will pass two values to hello_get.cgi program using GET method.
以下是处理网络浏览器提供输入的 hello_get.cgi 脚本。
Below is hello_get.cgi script to handle input given by web browser.
#!/usr/bin/perl
local ($buffer, @pairs, $pair, $name, $value, %FORM);
# Read in text
$ENV{'REQUEST_METHOD'} =~ tr/a-z/A-Z/;
if ($ENV{'REQUEST_METHOD'} eq "GET") {
$buffer = $ENV{'QUERY_STRING'};
}
# Split information into name/value pairs
@pairs = split(/&/, $buffer);
foreach $pair (@pairs) {
($name, $value) = split(/=/, $pair);
$value =~ tr/+/ /;
$value =~ s/%(..)/pack("C", hex($1))/eg;
$FORM{$name} = $value;
}
$first_name = $FORM{first_name};
$last_name = $FORM{last_name};
print "Content-type:text/html\r\n\r\n";
print "<html>";
print "<head>";
print "<title>Hello - Second CGI Program</title>";
print "</head>";
print "<body>";
print "<h2>Hello $first_name $last_name - Second CGI Program</h2>";
print "</body>";
print "</html>";
1;
Simple FORM Example: GET Method
这是一个简单的示例,它使用 HTML FORM 和 submit 按钮传递两个值。我们将使用相同的 CGI 脚本 hello_get.cgi 来处理此输入。
Here is a simple example which passes two values using HTML FORM and submit button. We are going to use same CGI script hello_get.cgi to handle this input.
<FORM action = "/cgi-bin/hello_get.cgi" method = "GET">
First Name: <input type = "text" name = "first_name"> <br>
Last Name: <input type = "text" name = "last_name">
<input type = "submit" value = "Submit">
</FORM>
以下是以上表单的实际输出,您输入名字和姓氏,然后单击 submit 按钮即可看到结果。
Here is the actual output of the above form, You enter First and Last Name and then click submit button to see the result.
First Name:
Last Name:
Passing Information using POST method
向 CGI 程序传递信息的一个通常更为可靠的方法是 POST 方法。此方法将信息打包的方式与 GET 方法完全相同,但是不是在 URL 中的 ? 之后作为文本字符串发送信息,而是作为单独的消息发送信息。此消息以标准输入的形式进入 CGI 脚本。
A generally more reliable method of passing information to a CGI program is the POST method. This packages the information in exactly the same way as GET methods, but instead of sending it as a text string after a ? in the URL it sends it as a separate message. This message comes into the CGI script in the form of the standard input.
以下是处理网络浏览器提供输入的 hello_post.cgi 脚本。此脚本将处理 GET 方法和 POST 方法。
Below is hello_post.cgi script to handle input given by web browser. This script will handle GET as well as POST method.
#!/usr/bin/perl
local ($buffer, @pairs, $pair, $name, $value, %FORM);
# Read in text
$ENV{'REQUEST_METHOD'} =~ tr/a-z/A-Z/;
if ($ENV{'REQUEST_METHOD'} eq "POST") {
read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'});
} else {
$buffer = $ENV{'QUERY_STRING'};
}
# Split information into name/value pairs
@pairs = split(/&/, $buffer);
foreach $pair (@pairs) {
($name, $value) = split(/=/, $pair);
$value =~ tr/+/ /;
$value =~ s/%(..)/pack("C", hex($1))/eg;
$FORM{$name} = $value;
}
$first_name = $FORM{first_name};
$last_name = $FORM{last_name};
print "Content-type:text/html\r\n\r\n";
print "<html>";
print "<head>";
print "<title>Hello - Second CGI Program</title>";
print "</head>";
print "<body>";
print "<h2>Hello $first_name $last_name - Second CGI Program</h2>";
print "</body>";
print "</html>";
1;
让我们再次采用上面相同的示例,它使用 HTML FORM 和 submit 按钮传递两个值。我们将使用 CGI 脚本 hello_post.cgi 来处理此输入。
Let us take again same example as above, which passes two values using HTML FORM and submit button. We are going to use CGI script hello_post.cgi to handle this input.
<FORM action = "/cgi-bin/hello_post.cgi" method="POST">
First Name: <input type="text" name="first_name"> <br>
Last Name: <input type="text" name="last_name">
<input type="submit" value="Submit">
</FORM>
以下是以上表单的实际输出,您输入名字和姓氏,然后单击 submit 按钮即可看到结果。
Here is the actual output of the above form, You enter First and Last Name and then click submit button to see the result.
First Name:
Last Name:
Passing Checkbox Data to CGI Program
如果要求选择多个选项,则使用复选框。
Checkboxes are used when more than one option is required to be selected.
下面提供了包含两个复选框的表单示例 HTML 代码
Here is example HTML code for a form with two checkboxes
<form action = "/cgi-bin/checkbox.cgi" method = "POST" target = "_blank">
<input type = "checkbox" name = "maths" value = "on"> Maths
<input type = "checkbox" name = "physics" value = "on"> Physics
<input type = "submit" value = "Select Subject">
</form>
此代码的结果是以下表单
The result of this code is the following form
Maths
Physics
下面是 checkbox.cgi 脚本,用于处理 Web 浏览器针对单选按钮提供的输入。
Below is checkbox.cgi script to handle input given by web browser for radio button.
#!/usr/bin/perl
local ($buffer, @pairs, $pair, $name, $value, %FORM);
# Read in text
$ENV{'REQUEST_METHOD'} =~ tr/a-z/A-Z/;
if ($ENV{'REQUEST_METHOD'} eq "POST") {
read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'});
} else {
$buffer = $ENV{'QUERY_STRING'};
}
# Split information into name/value pairs
@pairs = split(/&/, $buffer);
foreach $pair (@pairs) {
($name, $value) = split(/=/, $pair);
$value =~ tr/+/ /;
$value =~ s/%(..)/pack("C", hex($1))/eg;
$FORM{$name} = $value;
}
if( $FORM{maths} ) {
$maths_flag ="ON";
} else {
$maths_flag ="OFF";
}
if( $FORM{physics} ) {
$physics_flag ="ON";
} else {
$physics_flag ="OFF";
}
print "Content-type:text/html\r\n\r\n";
print "<html>";
print "<head>";
print "<title>Checkbox - Third CGI Program</title>";
print "</head>";
print "<body>";
print "<h2> CheckBox Maths is : $maths_flag</h2>";
print "<h2> CheckBox Physics is : $physics_flag</h2>";
print "</body>";
print "</html>";
1;
Passing Radio Button Data to CGI Program
如果要求只选择一个选项,则使用单选按钮。
Radio Buttons are used when only one option is required to be selected.
这是一个带有两个单选按钮的表单的示例 HTML 代码 −
Here is example HTML code for a form with two radio button −
<form action = "/cgi-bin/radiobutton.cgi" method = "POST" target = "_blank">
<input type = "radio" name = "subject" value = "maths"> Maths
<input type = "radio" name = "subject" value = "physics"> Physics
<input type = "submit" value = "Select Subject">
</form>
这段代码的结果是以下表单−
The result of this code is the following form −
Maths
Physics
下面是 radiobutton.cgi 脚本,用于处理 Web 浏览器针对单选按钮提供的输入。
Below is radiobutton.cgi script to handle input given by web browser for radio button.
#!/usr/bin/perl
local ($buffer, @pairs, $pair, $name, $value, %FORM);
# Read in text
$ENV{'REQUEST_METHOD'} =~ tr/a-z/A-Z/;
if ($ENV{'REQUEST_METHOD'} eq "POST") {
read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'});
} else {
$buffer = $ENV{'QUERY_STRING'};
}
# Split information into name/value pairs
@pairs = split(/&/, $buffer);
foreach $pair (@pairs) {
($name, $value) = split(/=/, $pair);
$value =~ tr/+/ /;
$value =~ s/%(..)/pack("C", hex($1))/eg;
$FORM{$name} = $value;
}
$subject = $FORM{subject};
print "Content-type:text/html\r\n\r\n";
print "<html>";
print "<head>";
print "<title>Radio - Fourth CGI Program</title>";
print "</head>";
print "<body>";
print "<h2> Selected Subject is $subject</h2>";
print "</body>";
print "</html>";
1;
Passing Text Area Data to CGI Program
如果必须将多行文本传递给 CGI 程序,则使用 TEXTAREA 元素。
TEXTAREA element is used when multiline text has to be passed to the CGI Program.
这是一个包含一个 TEXTAREA 框的表单的示例 HTML 代码−
Here is example HTML code for a form with a TEXTAREA box −
<form action = "/cgi-bin/textarea.cgi" method = "POST" target = "_blank">
<textarea name = "textcontent" cols = 40 rows = 4>
Type your text here...
</textarea>
<input type = "submit" value = "Submit">
</form>
这段代码的结果是以下表单−
The result of this code is the following form −
Type your text here...
下面是 textarea.cgi 脚本,用于处理 Web 浏览器提供的输入。
Below is textarea.cgi script to handle input given by web browser.
#!/usr/bin/perl
local ($buffer, @pairs, $pair, $name, $value, %FORM);
# Read in text
$ENV{'REQUEST_METHOD'} =~ tr/a-z/A-Z/;
if ($ENV{'REQUEST_METHOD'} eq "POST") {
read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'});
} else {
$buffer = $ENV{'QUERY_STRING'};
}
# Split information into name/value pairs
@pairs = split(/&/, $buffer);
foreach $pair (@pairs) {
($name, $value) = split(/=/, $pair);
$value =~ tr/+/ /;
$value =~ s/%(..)/pack("C", hex($1))/eg;
$FORM{$name} = $value;
}
$text_content = $FORM{textcontent};
print "Content-type:text/html\r\n\r\n";
print "<html>";
print "<head>";
print "<title>Text Area - Fifth CGI Program</title>";
print "</head>";
print "<body>";
print "<h2> Entered Text Content is $text_content</h2>";
print "</body>";
print "</html>";
1;
Passing Drop Down Box Data to CGI Program
当我们有许多可用选项,但只选择一个或两个时,可以使用下拉框。
Drop Down Box is used when we have many options available but only one or two will be selected.
这里有一个用于带有下拉框的表单的 HTML 代码示例
Here is example HTML code for a form with one drop down box
<form action = "/cgi-bin/dropdown.cgi" method = "POST" target = "_blank">
<select name = "dropdown">
<option value = "Maths" selected>Maths</option>
<option value = "Physics">Physics</option>
</select>
<input type = "submit" value = "Submit">
</form>
这段代码的结果是以下表单−
The result of this code is the following form −
Maths
Physics
下面是 dropdown.cgi 脚本,用于处理 Web 浏览器提供的输入
Below is dropdown.cgi script to handle input given by web browser.
#!/usr/bin/perl
local ($buffer, @pairs, $pair, $name, $value, %FORM);
# Read in text
$ENV{'REQUEST_METHOD'} =~ tr/a-z/A-Z/;
if ($ENV{'REQUEST_METHOD'} eq "POST") {
read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'});
} else {
$buffer = $ENV{'QUERY_STRING'};
}
# Split information into name/value pairs
@pairs = split(/&/, $buffer);
foreach $pair (@pairs) {
($name, $value) = split(/=/, $pair);
$value =~ tr/+/ /;
$value =~ s/%(..)/pack("C", hex($1))/eg;
$FORM{$name} = $value;
}
$subject = $FORM{dropdown};
print "Content-type:text/html\r\n\r\n";
print "<html>";
print "<head>";
print "<title>Dropdown Box - Sixth CGI Program</title>";
print "</head>";
print "<body>";
print "<h2> Selected Subject is $subject</h2>";
print "</body>";
print "</html>";
1;
Using Cookies in CGI
HTTP 协议是一种无状态协议。但是,对于商业网站,需要在不同页面之间维护会话信息。例如,用户注册在完成多个页面后结束。但是,如何在所有 Web 页面中维护用户的会话信息。
HTTP protocol is a stateless protocol. But for a commercial website it is required to maintain session information among different pages. For example one user registration ends after completing many pages. But how to maintain user’s session information across all the web pages.
在许多情况下,使用 cookie 是记忆和跟踪偏好、购买、佣金和其他信息最有效的方法,而这些信息对于提升访问者体验或网站统计至关重要。
In many situations, using cookies is the most efficient method of remembering and tracking preferences, purchases, commissions, and other information required for better visitor experience or site statistics.
How It Works
您的服务器会以 Cookie 的形式向访客的浏览器发送一些数据。浏览器可能会接受 Cookie。如果接受,它将作为纯文本记录存储在访客硬盘上。现在,当访客到达您站点上的另一个页面时,可以检索 Cookie。检索后,您的服务器知道/记住存储的内容。
Your server sends some data to the visitor’s browser in the form of a cookie. The browser may accept the cookie. If it does, it is stored as a plain text record on the visitor’s hard drive. Now, when the visitor arrives at another page on your site, the cookie is available for retrieval. Once retrieved, your server knows/remembers what was stored.
Cookie 是纯文本数据记录,包含 5 个可变长度字段:
Cookies are a plain text data record of 5 variable-length fields −
-
Expires − The date the cookie will expire. If this is blank, the cookie will expire when the visitor quits the browser.
-
Domain − The domain name of your site.
-
Path − The path to the directory or web page that set the cookie. This may be blank if you want to retrieve the cookie from any directory or page.
-
Secure − If this field contains the word "secure" then the cookie may only be retrieved with a secure server. If this field is blank, no such restriction exists.
-
Name=Value − Cookies are set and retrviewed in the form of key and value pairs.
Setting up Cookies
以 cookie 形式将 Cookie 发送到浏览器非常容易。这些 Cookie 将随 HTTP 标头一起发送。假设你想将 UserID 和 Password 设为 Cookie。则它将按如下方式完成 −
This is very easy to send cookies to browser. These cookies will be sent along with HTTP Header. Assuming you want to set UserID and Password as cookies. So it will be done as follows −
#!/usr/bin/perl
print "Set-Cookie:UserID=XYZ;\n";
print "Set-Cookie:Password=XYZ123;\n";
print "Set-Cookie:Expires=Tuesday, 31-Dec-2007 23:12:40 GMT";\n";
print "Set-Cookie:Domain=www.tutorialspoint.com;\n";
print "Set-Cookie:Path=/perl;\n";
print "Content-type:text/html\r\n\r\n";
...........Rest of the HTML Content....
根据此示例,你一定理解了如何设置 Cookie。我们使用 Set-Cookie HTTP 标头来设置 Cookie。
From this example you must have understood how to set cookies. We use Set-Cookie HTTP header to set cookies.
在此,可以选择设置 Expires、Domain 和 Path 等 Cookie 属性。值得注意的是,Cookie 是在发送魔法行 "Content-type:text/html\r\n\r\n 之前设置的。
Here it is optional to set cookies attributes like Expires, Domain, and Path. It is notable that cookies are set before sending magic line "Content-type:text/html\r\n\r\n.
Retrieving Cookies
提取所有设置的 Cookie 非常容易。Cookie 存储在 CGI 环境变量 HTTP_COOKIE 中,它们将具有以下形式。
This is very easy to retrieve all the set cookies. Cookies are stored in CGI environment variable HTTP_COOKIE and they will have following form.
key1=value1;key2=value2;key3=value3....
下面是一个如何检索 Cookie 的示例。
Here is an example of how to retrieving cookies.
#!/usr/bin/perl
$rcvd_cookies = $ENV{'HTTP_COOKIE'};
@cookies = split /;/, $rcvd_cookies;
foreach $cookie ( @cookies ) {
($key, $val) = split(/=/, $cookie); # splits on the first =.
$key =~ s/^\s+//;
$val =~ s/^\s+//;
$key =~ s/\s+$//;
$val =~ s/\s+$//;
if( $key eq "UserID" ) {
$user_id = $val;
} elsif($key eq "Password") {
$password = $val;
}
}
print "User ID = $user_id\n";
print "Password = $password\n";
This will produce following result
User ID = XYZ
Password = XYZ123