Posted: 2005/1月/07 9:44上午 | IP記錄
|
|
|
Cookies
很少有網絡技術能夠象cookies來在網絡用戶間製造這樣大的爭論。Cookies只是一個無辜的名字,但是許多用戶將這與邪 惡的目的連在一起。
Netscape首先在它的瀏覽器中引入了cookies,從那時起,World Wide Web協會就支持cookie標準。大部分瀏覽器現在都兼容cookie的使用。
Cookies是什麼?瀏覽器用一個或多個限定的文件支持Cookie。這些文件在Windows機器上叫做Cookie文件或 者在Macintosh中叫做magic cookie文件,被網站用來在上面存儲Cookie數據。網站可以在這些Cookie文件中插入信息。這樣對有些網絡用戶就有 些副作用。有些用戶認為這造成了對隱私的侵犯。更糟的是:有些人認為Cookie是對個人空間的侵佔。
目前有些Cookie是臨時的,還有一些則是持續的。例如,cookies被Active Sever Pages用來跟蹤用戶進程直到用戶離開網站。另外有些Cookie則保持在Cookie文件中直到用戶返回時又進行調用。
在cookie文件中保存cookies會產生很大的問題。主要是有些用戶擔心會跟蹤用戶網上衝浪的習慣。害怕這種信息如果落入 一些『黑手』,那麼個人也就可能成為一大堆廣告垃圾信箋的對象,不過,這種擔心根本不會發生,因為無法跨過網站來獲得cooki e信息,以這種目的來應用Cookie是不可能的。不過,由於一些用戶錯誤的理解以及『以訛傳訛』,一些瀏覽器開發商別無選擇只 能作出響應(例如Netscape4.0提供了屏蔽Cookie的選項)。
注意
目前一些有關Cookie侵犯隱私權的討論已經到了歇斯底里的地步,甚至包括網站站長、專家級的一些人物也在這種認識上犯過錯誤 。
目前的主流瀏覽器是這樣的,IE和NETSCAPE都提供了附加的控制Cookie的手段,其中NETSCAPE4.0不但可以 對接受Cookie進行警告,而且還可以屏蔽掉Cookie, IE3.0也可以屏蔽Cookie,但是由於微軟開發出了Active Server Pages,因此在IE4.0中就只能進行接受警告而沒有提供屏蔽選項。
更過分的是,很多技巧的技術甚至已經可以在不能屏蔽cookie的瀏覽器上進行Cookie的屏蔽。例如,將你的cookie文 件作成只讀(參見http://www.cookiecentral.com)
很不幸,由於上述原因,你的網站利用Cookie就會有各種麻煩,甚至造成Session的調用失敗。
Cookie是怎樣工作的
Cookies將通過HTTP Headers來從服務端返回到瀏覽器上。服務端首先在響應中利用Set-Cookie header來創建一個Cookie,瀏覽器後面的請求的cookie header中就會返回這個Cookie來完成瀏覽器的認證。
假設你創建了一個名字為UserName的Cookie來包含訪問者的信息,創建Cookie時,Server的Header就 像下面(假設訪問者為Bill Gates):
Set-Cookie: UserName=BILL+Gates;path=/;domain=aspsite.com;
expires=Tuesday,01-Jan-99 00:00:01 GMT
這個Header就在瀏覽器的電腦上的Cookie文件中添加了一條記錄。瀏覽器將名字為UserName的Cookie賦值為 Bill Gates。請注意這個cookie的值是進行了URL-encoded操作的。
後來,header通知瀏覽器將cookie通過請求以忽略路徑的方式返回服務端,因此,一個Cookie設定後,其應用的所有 文件就必須在同一個目錄下,例如如果開始指定的路徑是/private目錄,那麼cookie Header對文件:/private/mypage.asp的請求就可以,而/mypage.asp由於路徑變動就無法利用這 個Cookie了。
domain屬性能夠在瀏覽器端更加對cookie發送進行限定。在這個例子中,cookie只能傳到指定的服務器上,而決不會 跑到什麼www.yahoo.com或者什麼其他網站。
注意
現在的瀏覽器在判斷Cookie的路徑時是區分大小寫的,這就意味著如果路徑是/private,那麼以/PRIVATE路徑方 式就無法進行這個Cookie的調用和認證。
最後,Expires標記限定了Cookies的過期時間,在例子中的Header中,限定瀏覽器將該Cookie保存到199 9年1月1日第一秒,實際上,瀏覽器在接受的Cookie很多時,還會自動進行刪除。
瀏覽器創建了一個Cookie後,在每一個針對該網站的請求時就都會在Header中帶著這個Cookie,也就是每一次滿足該 路徑的情況下這個Cookie都會有效。不過,對於其他網站的請求Cookie是絕對不會跟著發送的。瀏覽器會這樣一直發送到C ookies過期為止。Cookie Header如下:
cookie: username: Bill+Gates
在Active Server Pages中創建和讀取Cookies
當利用Active Server Pages創建了一個cookie之後,你就可以使用Response對象的Cookie集合了。你可以創建兩種cookie; 一種是單值的,另一種可以認為是cookie字典類型,即允許多個鍵值對的存在。
創建單值的相對簡單,如下腳本:
<% Response.Cookies(「Username」)=」Bill Gates」
Response.Cookies(「Username」).Expires=」Jan 1,1999」
%>
這個腳本的工作一目瞭然,將名字為Username的Cookie賦值為Bill Gates, 同時將過期時間限定為1999年1月1日,這裡面需要說明的是,Expires屬性如果不進行賦值,那麼默認的就是用戶一離開網 站就過期。
由於這個例子腳本創建的是Header的部分,那麼你就必須在你的Active Server Pages的任何輸出語句之前進行這個腳本的操作,或者使用Buffer輸出,(參看14章的有關小節)。
前面的腳本是創建一個Cookie的簡單示例,只是使用了最常用的Expires屬性,其實還有許多其他屬性也可以自行設置,下 面是一個比較完全的例子:
<%
Response.Cookies(「Username」)=」Steve Jobs」
Response.Cookies(「Username」).Expires=」Jan 1, 1999」
Response.Cookies(「Username」).Path=」/examples」
Response.Cookies(「Username」).Domain=」aspsite.com」
Response.Cookies(「Username」).Secure=True
%>
這個腳本例子和前面的其實沒有什麼區別,不過有三個附加的屬性需要解釋:
■Path屬性是用來更加嚴格的限定瀏覽器發送Cookie,在這個例子中,只有針對於 /examples目錄的請求的Header中才攜帶Cookie信息,例如/examples/hello.asp以及 /examples/chapter16/hello.asp的請求都會在Header上攜帶Cookie信息,但是如果是瀏覽 器對/hello.asp的請求就不會攜帶該Cookie信息。Path屬性的默認值是該Cookie創建的Active Server Pages所在的路徑。(也就是說,即便不做指定,也不會跨過目 錄發送Cookie)
■Domain屬性,限定了Cookie發送的網站,例子中的aspsite.com說明cookie可以被發送到www.aspsite.com 或者beetle.aspsite.com或者yeah.aspsite.com等等,同樣作為默認值是該Cookie創建的網 站。
■最後是Secure屬性,顧名思義,該屬性設為True則傳遞中就實行了加密算法,如果你正在使用安全接口層,那麼你就可以使 用這個屬性(參見第二章,安裝使用 Internet Information Server)
在一個Active Server Page中讀取cookie,你只需要使用Request對象的Cookies集合, 例如,輸出一個cookie值,那麼腳本如下:
<%=Request.Cookies(「Username」) %>
這個腳本將名字為Username的Cookie值進行了輸出,和以前同樣的是,你依然可以利用For Each循環或者利用Count屬性和For …Next循環結合的方式來將Cookie集合 的所有屬性值顯示出來,下面這個例子的運行結果應當無須解釋了。
<%
For EACH thing IN Request.Cookies
Response.write(「<BR>」&thing&Request.Cookies(th ing))
NEXT
%>
創建多個Cookie
你當然還可以創建不止一個Cookie,只是在Response對象的Cookies集合中簡單的定義多個名稱就可以了。不過, 許多瀏覽器對一個指定網站就限定了三到四個Cookie。
創建多個Cookie還有一種選擇,就是創建一個Cookie字典,那麼一個Cookie字典中就可以含有多個鍵值對,下面是這 麼一個字典的例子:
<%
Response.Cookies(「User」)(「Name」)=」Bill Gates」
Response.Cookies(「User」)(「Password」)=」billions」
%>
這個腳本創建了一個名為User的Cookie字典,其中含有兩個鍵分別是Name和 Password,當這麼Cookie字典創建時,請求的Header中是這樣的信息:
Set-Cookie:User=Name=Bill+Gates&Password=billions
一個名字為User的Cookie創建了,其中含有兩個鍵值對,這意味著所有的鍵和相應的值都在一個大的Cookie中。
接受這樣的Cookie值,你還可以利用以前的Response對象的Cookies集合,既可以將其全部顯示,(這樣顯示就是 沒有經過解碼的Header中的源代碼,也就是上面Header中的信息,這樣一般都是用於調試工作)也可以按每一個鍵的相應名 稱顯示相應值,如下例,無須解釋結果:
<%=Request.Cookies(「User」) %>
<%=Request.Cookies(「User」)(「Name」)%>
<%=Request.Cookies(「User」)(」Name」)%>
注意
利用Cookie技術傳遞諸如密碼這樣的信息要特別小心,因為一般說來,這種信息是未經加密的,當然,如果你的網站有安全接口層 技術,也可以進行加密傳輸,但是在瀏覽器端該信息還是存放在文本文件中。
如果希望知道一個Cookie是否是一個Cookie字典,可以用HasKeys屬性,例如下面腳本如果返回值為True,那麼 就是一個Cookie字典。
<%=Request.Cookies(「User」).HasKeys %>
|