用ASP檢測瀏覽器是否允許Cookie功能的方法
作 者:董雲 YUN DONG
工作單位:黃埔海關技術處工程師
郵寄地址:廣州市經濟技術開發區志誠大道海關大樓
電話號碼:020-82130556
郵遞區號:510730
電子郵件:dy168@163.net
摘 要:指出用ASP檢測瀏覽器Cookie功能的誤區,說明錯誤的原因,並給出
解決方案和原始碼
關鍵詞:瀏覽器、Cookie、資訊記錄區
一、前言
檢測瀏覽器是否允許Cookie功能其實並不困難。許多的文章都討論到這個問題,但是,這
些文章中往往存在著許多問題,使得讀者容易混淆,甚至有些文章中所給出的方法根本就是
錯誤的。本文將一步一步地詳細解釋困難所在,並給出實用的ASP代碼。
二、問題的提出
儘管現在的瀏覽器基本上都支援Cookie功能,但是使用者可以通過設定將Cookie功能禁止,
對於希望將一些資訊記錄到瀏覽器上去的Web伺服器,就必須要清楚前來訪問的使用者瀏覽
器是否支援Cookie功能,惟一的辦法就是自己去測試使用者瀏覽器是否支援Cookie。這個問
題似乎十分簡單,正如許多文章中所介紹的一樣,我先給出一段ASP代碼,它似乎可以輕
易地完成任務。
Cookie_test.asp
<%@ Language="VBScript" %>
<%
Option Explicit
Dim CookieValueset
Dim CookieValueRead
CookieValueset="true"
CookieValueRead="false"
Response.Cookies("Cookie_test") = CookieValueset
Response.Cookies("Cookie_test").Expires = Date + 1
CookieValueRead = Request.Cookies("Cookie_test")
If CookieValueRead = CookieValueSet Then
Response.Write "瀏覽器支援Cookies"
Else
Response.Write "瀏覽器不支援Cookies"
End If
%>
實際上,上述代碼在瀏覽器允許和禁止Cookie功能的情況下,均得到瀏覽器支援Cookie功
能的結果。為什麼會產生這樣的結果呢?首先讓我們來看一下Cookie的原理。瀏覽器是遵
循HTTP協議訪問Web伺服器的,一個完全的HTTP請求是由瀏覽器發出申請,Web服務
器響應其申請的內容,在這個過程中,瀏覽器會提供一塊資訊記錄區來儲存一些特殊的資訊,
這個資訊記錄區是可以由瀏覽器和Web伺服器同時訪問的,而Cookie就儲存在這個資訊記
錄區中。通過這個資訊記錄區,Web伺服器可以寫入Cookie以記錄一些資訊,並且可以在
將來進行訪問,直到這個Cookie的生命期終止。在ASP代碼中的Response.Cookies和
Request.Cookies類就是用來訪問Cookie的。
現在的問題在於,按照HTTP協議,在往瀏覽器中寫入Cookie後,其內容實際上存在於緩
存之中,直到該頁面終止,才將內容寫入到瀏覽器提供的資訊記錄區中去。在同一頁面中寫
入Cookie後立即讀出其內容,讀出的是緩衝中的臨時資訊,而不是資訊記錄區中真正的
Cookie內容,所以在上面的代碼中,即使瀏覽器禁止Cookie功能,仍然得到成功寫入Cookie
的結果。
三、問題的解決
要解決這個問題,可以有兩個辦法,第一個辦法是利用兩個頁面檔來分別進行Cookie的
寫入和讀出,在第一個檔中寫入Cookie,然後轉向第二個檔讀出並判斷,這樣可以輕
易地得到正確的結果。但訪問兩個頁面檔的方法顯然對Web伺服器的管理添加了麻煩,
在不擔心這個問題的前提下,這是一個最佳的解決方案。
第二個辦法是利用ASP中的REDIRECT語句來解決問題,如下筆者給出ASP原始碼。瀏
覽器訪問Cookie.asp,這個檔中含有一些代碼判斷Cookie檢查是否已經作過,如果是,
則顯示檢查結果,如果沒有,則自動轉向Cookie_Detect.asp檔,在該檔中測試Cookie
功能並將結果傳回給Cookie.asp。值得強調的是,我們不能使用ASP的Cookies和Sessions,
因為它們都是利用前面所提的資訊記錄區來儲存資訊的,當Cookie功能禁止後,不可跨頁
面使用。因此,筆者使用了QuerySring 來傳遞參數。
四、原始碼
Cookie.asp
<%@ Language="VBScript" %>
<%
Option Explicit
Response.Buffer = True
Dim bCookies ' T/F indicating Cookies enabled.
bCookies = Request.QueryString("Cookies")
Select Case LCase(bCookies)
Case "true", "false"
' We got a valid response.
bCookies = CBool(bCookies)
Case Else
Response.Cookies("Cookie_test") = "true"
Response.Redirect "Cookie_detect.asp"
End Select
%>
<html>
<head>
<title>檢測瀏覽器是否允許Cookie功能</title>
</head>
該瀏覽器Cookies功能: <%= bCookies %>
</body>
</html>
Cookie_detect.asp
<%@ Language="VBScript" %>
<%
Option Explicit
Response.Buffer = True
Dim bCookiesEnabled
bCookiesEnabled = Request.Cookies("Cookie_test")
bCookiesEnabled = (bCookiesEnabled = "true")
Response.Redirect "Cookie.asp" & "?Cookies=" & bCookiesEnabled
%>