網(wǎng)上調(diào)查是快速收集信息的有效方法,但是目前部分網(wǎng)站的網(wǎng)上調(diào)查存在一個不足之處,即任何用戶根據(jù)自己的愛好可以連續(xù)反復投票。因為所有的調(diào)查結果都是為決策作參考,不管對一個單位還是一個部門,決策失誤都會帶來意想不到的損失,所以防止重復投票具有重要意義。本文所給出的基于ASP(Active Server Page)的幾種方法在一定程度上可以防止連續(xù)反復投票。 ASP對象 在ASP中有5個對象:Request、Response、Session、 Application、Server。下面只針對本文能用到的對象屬性進行說明,其他方面的屬性請參考相關資料。本文提供的方法的原理是:設置一個邏輯變量IsVoted,在投票之前驗證IsVoted 的值,只有值為False時,才能投票,否則就認為已投過票。 Application對象是處理某一特定ASP應用中所有用戶共享信息的對象,也就是說Application對象是所有聯(lián)網(wǎng)機器上所有網(wǎng)頁所共享的對象。由 Application對象所定義和設置的變量,所有用戶的所有網(wǎng)頁均可訪問。利用Application對象可以定義變量以及改變變量的值,其語法格式如下: Application(“變量名”)=表達式。在.asp 文件中可通過Application(“變量名”)加以引用。Application把變量的值保存在Web Server 端。 Session對象用于單個用戶管理信息,Session變量只在頁面間調(diào)用(即在一個Session內(nèi))。Session變量是私有的,一個Session中某個變量值的改變不影響另一個Session中同名變量的值。Session對象也把變量值保存在服務器端,但是各個Session保存的位置不同。因為Session是私有的,所以有多少個Session對象就存在多少個IsVoted變量,這些變量之間沒有關系。 Cookies對象是不能單獨存在的,它依附于Request和 Response對象,在使用時必須在Cookies前加上Request或Response。同Application和Session 一樣,Cookies也能保存變量的值,但是Cookies只在瀏覽器客戶端保存變量的值。用Cookies 所定義的變量有一個屬性:可以設置Cookies變量的使用期限,而且一旦設置了使用期限, Cookies變量可以被從同一臺機器上登錄的所有用戶所共享,我們可以利用Cookies的這個屬性設置間隔一定時間才能再次投票。 Server對象主要完成一些需要WWW服務器處理的工作,本文中我們主要利用Request.ServerVariables讀取Server的環(huán)境變量中客戶端的IP地址,并根據(jù)IP地址來設定相隔多長時間同一IP地址才能再次投票。 Global.asa文件完成共享變量和文件的定義及初始化任務。Global.asa文件必須位于ASP應用的根目錄下,一個ASP應用只能有一個Global.asa文件。Global.asa中含有Application_OnStart、Application_OnEnd、Session_OnStart、 Session_OnEnd四個事件,我們在Application_OnStart、Session_OnStart事件中定義 Application變量和Session變量以及進行初始化,這樣在以后的網(wǎng)頁中就可以讀取這些變量。 ASP在下列情況下讀取Global.asa內(nèi)容: 1.在Web Server啟動之后,第一次請求調(diào)用ASP應用中的任何.asp文件時; 2.不在Session狀態(tài)的用戶請求調(diào)用ASP應用的.asp文件。 方法一:利用Session對象 在Global.asa的Session_OnStart事件中設置邏輯變量 IsVoted,初始值為FALSE(表示還沒有投票),投票之后在.asp程序中把IsVoted的值改為TRUE(表示已投過票)。每次投票之前都要判斷IsVoted的值。如果IsVoted的值為TRUE,就不能再投票;如果值為FALSE,則可以投票。 因為Session對象的使用必須與瀏覽器的Cookies功能相配合,所以在判斷IsVoted值之前,必須先判斷瀏覽器的Cookies功能是否打開。如處于關閉狀態(tài),則此種方法失效,所以在這種情況下必須給出提示信息并用Response.End命令中斷.asp程序的執(zhí)行,防止連續(xù)反復投票。其流程如圖1: 其中判斷Cookies是否打開的函數(shù)比較復雜,現(xiàn)給出函數(shù)實現(xiàn)代碼(VBScript)。 < % Function IsCookiesOpen() Dim ClientIP, URL, QueryString, IsNew Application.Lock If Session(“SessionID")=Session.SessionID Then IsCookiesOpen = True ClearApp Exit Function End If IsNew = False If Session(“SessionID") = Empty Then CurrentIP =Request.ServerVariables (“REMOTE_ADDR") If CurrentIP <> Application(“IP") Then ClearApp IsNew = True End If End If If Not IsNew And Application(“Visit") >= 1 Then IsCookiesOpen = False ClearApp Exit Function End If Application(“Visit") = Application(“Visit") + 1 Application(“IP") =Request.ServerVariables (“REMOTE_ADDR") Session(“SessionID") = Session.SessionID URL =“_page_=”&Request.ServerVariables (“PATH_INFO") QueryString=Request.ServerVariables (“QUERY_STRING") If Len(QueryString) > 0 Then URL = URL & “&" & QueryString If Not Response.IsClientConnected Then ClearApp End Function Sub ClearApp() Application(“Visit") = 0 Application(“IP") = “" End Sub % > 在.asp文件中直接用IsCookiesOpen()函數(shù)來判定 Cookies是否打開。 此種方法的漏洞:如果再打開一個新瀏覽器窗口,會發(fā)現(xiàn)在新打開的瀏覽器窗口中仍然可以投票。這是因為Session是私有的,一個Session中變量的改變并不影響另一個Session的同名變量的值。為了解決這個問題,下面給出方法二。
|