14-4 ヶep瘞?

小餅乾(Cookies)是 Netscape 公司所發展出來的概念,其目的就是要克服 Http Protocals 的 Stateless 的特性,企圖在客戶端存取一些資訊,使得在 Http Requests 之間,能保留一些共通的資訊。我們可以使用客戶端的 JavaScript 來讀寫小餅乾,有關此部分的細節,請讀者參閱參考本書前面的相關章節。本節主要是討論如何以 ASP 來對小餅乾進行各種處理。

嚴格的說,小餅乾並不是 ASP 裡面一個單獨的物件,它是由 Request.Cookies 及 Response.Cookies 兩部分所構成,前者可用來讀取小餅乾的內容,後者可用來設定小餅乾的內容。

我們可以使用 Request.Cookies(Name) 來讀取當用戶對伺服器進行要求時,所傳送的相關小餅乾資訊。由於 Request.Cookies 是一個 Dictionary 變數,所以我們可以對其內容進行一一列表,例如:

Example(request/listCookie01.asp):

上述範例的完整原始檔案如下:

原始檔(request/listCookie01.asp):(灰色區域按兩下即可拷貝)
<%@Language=JScript%>
<%
today= new Date();
Response.Cookies("111") = today.toLocaleString();
Response.Cookies("222") = "bbb";
%>
<% title = "以 JScript 印出 Request.Cookies 的內容" %>
<!--#include file="../head.inc"-->
<hr>

<!--#include file="../listdict.inc"-->
<% listdict(Request.Cookies, "Request.Cookies"); %>

<hr>
<!--#include file="../foot.inc"-->

在上述範例中,我們為了要使印出來的小餅乾不是空的,所以我們先使用 Response.Cookies("111") = today.toLocaleString() 以及 Response.Cookies("222") = "bbb" 來設定了兩個小餅乾,接著我們使用 listdict() 函數來印出來存放於 Request.Cookies 的所有小餅乾的值。(有關於 Response 物件,會在下一章說明。)

一般讀者會對於小餅乾設定和列表的順序有所混淆不清,以下是一個簡單的驗證範例,驗證程序如下:

  1. 先發生的事:我們先使用 Request.Cookes 來列出與本頁相關的小餅乾。
  2. 後發生的事:我們再使用用戶端的 JavaScript 來設定小餅乾,名稱是 lastLoadTime,記錄網頁載入時間。
範例如下:

Example(request/setCookieViaJs01.asp):

當您反覆重載此網頁時,可以觀察到事項:

換句話說,Request.Cookies 會先傳送目前此頁相關的小餅乾至伺服器,網頁下載後,才會經由用戶端的 JavaScript 來更新此頁的小餅乾,這個時間的先後順序,請特別注意。本範例的原始碼如下:

原始檔(request/setCookieViaJs01.asp):(灰色區域按兩下即可拷貝)
<%@Language=JScript%>
<% title = "以 JScript 印出 Request.Cookies 的內容" %>
<!--#include file="../head.inc"-->
<hr>

<script src="cookieUtility.js"></script>
<script>
today = new Date();
todayString = today.toLocaleString();
// 後在用戶端做的事:設定小餅乾
setCookie("lastLoadTime", todayString);
document.write("This page's loading time = " + todayString);
</script>
(此小餅乾已經被寫入,但無法立刻由 server script 來顯示,必須由 client script 來顯示。)

<h3>由 Server Script 所顯示的(舊的、送到伺服器的)小餅乾:</h3>
<!--#include file="../listdict.inc"-->
<!--先在伺服器做的事:列出本頁的小餅乾-->
<% listdict(Request.Cookies, "Request.Cookies"); %>

<h3>由 Client Script 所顯示的(目前的)小餅乾:</h3>
<script>listCookie();</script>

<!--
<input type=button value="Remove all cookies and reload" onClick="delAllCookie(); history.go(0)">
-->

<hr>
<!--#include file="../foot.inc"-->

請特別注意,在上述範例原始碼中,雖然看起來我們是先使用用戶端的 JavaScript 來設定小餅乾、再用 Request.Cookies 來列出所有小餅乾的內容,但在執行順序上,會先由 ASP 來列出 Request.Cookies 的內容,然後再傳到用戶端,由用戶端的 JavaScript 來設定小餅乾。

Hint
所有ASP的網頁,都是先在伺服器端執行server-side scripts,然後才到用戶端執行client-side scripts,這個順序不會因為 server-side scripts和client-side scripts在網頁中的位置不同而有所改變。

以下再度列出小餅乾的製作流程,以供參考:

Request.Cookies 只負責傳送小餅乾資訊至伺服器,若要從伺服器設定小餅乾,可以使用 Response.Cookies,這會在下一章說明。

Hint
Request.Cookeis 只負責傳送小餅乾,所以是唯讀的,你並無法修改 Request.Cookies 的值。


JScript 程式設計與應用:用於伺服器端的 ASP 環境