如何在當使用者連線到 CGI 程式的時候,保持一些“狀態“資訊?

使用隱藏的格式

一個有效的方式是在格式中(form)使用隱藏的格子。譬如:
<INPUT TYPE=hidden NAME=state VALUE="利用格式傳回隱藏的資料">
現在大部份的瀏覽器都可以處理隱藏形式的資料,但是必須要了解的是有一些瀏 覽器卻無法處理這樣的資料(同時也可能會令使用者疑惑)。我們應該注意,“ 隱藏(hidden)“並不表示“祕密(secret)“,使用者依然可以利用“view source “的方式來看到這些資料。

如果瀏覽器不能顯示出可以透過最小化(SIZE=0)的屬性來隱藏格式,那麼就會產 生一個很醜的格子。

使用 PATH_INFO 變數

另一個方式是透過 PATH_INFO 環境變數的方便之處。 PATH_INFO 包含了任何含 CGI 的 URL 中, CGI 程式*後面*所接的文字。譬如,如果 CGI 的 URL 是:

http://mysite.com/cgi-bin/mycgi

但是您卻可能以底下的方式來呼叫這個 CGI 程式:

http://mysite.com/cgi-bin/mycgi/Bob/27

那麼這個“mycgi“依然會被執行 -- 而 PATH_INFO 這個環境變數就會包含了 /Bob/27 這些文字。當您由一個 CGI 呼叫下一個 CGI 程式的時候,您可以透 過輸出包含這個狀態資訊的 URLs 來保留您想要的資訊。

需要記住的是 URLs 被限制在 1024 個字元之內,瀏覽器將不會被要求去處理多餘的 字元。如果您需要更多或是有令人討厭的長 URLs ,那麼您可以簡單的保留一個暫存 檔案的名稱,而將那些您想要傳遞的資料存放在暫存檔中即可。

使用 HTTP "Cookies"

"Cookies" 是一個新的結構,由 Netscape 提出,它允許伺服器支援透過瀏覽器來保留 一些狀態資訊。而下一次,由伺服器的一個特別的小部份提出 URL 的需求,而和 “cookie“有關的資訊就會被當成是需求的一部份而送到伺服器上!Cookies 正被 Netscape 以及 Microsoft 的 Internet Explorer (2.0)所應用。而當您閱讀這份 文件的時候,可能有更多的瀏覽器支援這項功能。但是最好的方式是確定不使用這些功 能的時候,您的資訊頁還是可以被正常的閱讀。

例如,您的 CGI 程式可能輸出底下的資料來設定一個 "cookie"。 (注意,Set-Cookie: 的標頭必須出現在完整的一行)

Content-type: text/html
Set-Cookie: cookiename=valueofcookie; expires=Saturday, 28-Feb-96 23:59:59 GMT; path=/cgi-bin/mycgiprogram

<h1>Web page follows.<h1>

每次當有 URL 來要求伺服器送出一份包含 /cgi-bin/mycgiprogram 的 時候,那麼被設定的 "cookie" 將總是會被送到伺服器上。這一個 cookie 將會持續送出直到清除的時間到了。清除的時間應該使用上面提過的格林威治時間標準 來設定,但是需要注意的是瀏覽起可能有當地時間的設定,以致於搞混了。正因為這樣 , cookie 最好設定在 24 小時以後清除。

當您的 CGI 程式再一次被使用者連線的時候,被瀏覽器設定的 cookies 將會呈現出 HTTP_COOKIE 這一個環境變數。每一個 cookie 將會出現一個類似 NAME=VALUE 的小 對子。每一對的設定都由分號(;)接著空白來隔開。

就像格式中所說得,在 cookies 中,一些不常用的字元應該利用 %xx 記號的方式來跳 脫(% 後面跟著兩位 16 進位數字來指出字元的 ASCII 碼)。

看看 Netscape 的 Cookie Specification Page <URL:http://www.netscape.com/newsref/std/cookie_spec.html> 來取得更多詳細並且有用的資料。


World Wide Web FAQ