引言:最近不少網(wǎng)友都有這樣的疑問,就是當(dāng)我們在一個網(wǎng)頁間設(shè)定了一個session變量后,到另一個網(wǎng)頁,卻消失了。這 是什么樣的原因呢。如果你詳細(xì)的讀完本文,相信能給你一個完整的答復(fù)!
一:前言--關(guān)于web應(yīng)用程序
我們今天所討論的web 應(yīng)用程序是指由Windows NT Option Pack 提供的一個建立 Internet 或Intranet的 Web應(yīng)用程 序的平臺。而Web 應(yīng)用程序可以作為一組 Web 頁交付使用,它們向封裝了事務(wù)邏輯并提供訪問存儲重要商業(yè)信息的數(shù)據(jù)庫 應(yīng)用程序和 ActiveX 組件提供用戶界面。也就是我們使用的asp程序。 創(chuàng)建應(yīng)用程序時,必須用 Internet 服務(wù)管理器在 Web 站點中指定應(yīng)用程序的啟動點目錄。在發(fā)現(xiàn)其他啟動點之前, Web 站點某啟動點目錄下的每個文件和目錄被視為是應(yīng)用程序的一部分。因此,可以使用目錄邊界定義應(yīng)用程序的范圍。 基于 ASP 的應(yīng)用程序是 ASP 頁和 ActiveX 組件的集合。當(dāng)用戶定義應(yīng)用程序時,將使用 IIS指定用戶的 Web 站點中 應(yīng)用程序啟動點的目錄。在用戶的 Web 站點中每個位于啟動點目錄下的文件和文件夾都被認(rèn)為是應(yīng)用程序的一部分,直到 發(fā)現(xiàn)另外的啟動點目錄為止。這樣,用戶就可以使用目錄作為邊界定義應(yīng)用程序的作用域。每個 Web 站點可以有多個應(yīng)用 程序,而每個應(yīng)用程序的配置都可以不同。
二:web應(yīng)用程序的范圍
正如上面的定義所提到的。我們將一個web應(yīng)用程序,如:購物程序,新聞程序,聊天程序......等這樣一些我們開發(fā) 的asp頁面單獨集中來成為一個web應(yīng)用程序。結(jié)合實例來說,如我們將一個購物程序的所有頁面(如:注冊頁面,購物 車,收銀臺,訂單頁面,商品頁面)統(tǒng)一起來,統(tǒng)稱為一個web購物程序,它的應(yīng)用程序范圍就是從購物開始購物結(jié)束所涉 及到的所有頁面。而在iis中,系統(tǒng)須將其分配到一個虛擬目錄中去,而該虛擬目錄的所有頁面,及其子目錄就是其購物程 序的物理范圍。如下表所示。 *shop—index.asp —buy.asp +catalog—list.asp +customer—a.asp —b.asp 其中*號,代表的是一個虛擬目錄,+代表的是其中的子目錄。所以,整個上面的所有頁面構(gòu)成了一個web應(yīng)用程序。但是, 也可以在一個虛擬目錄下建立另一個應(yīng)用程序。如下表 *shop—index.asp —buy.asp *book—book.asp +catalog—list.asp +customer—a.asp —b.asp 這樣,shop下的index.asp,list.asp,a.asp等屬于一個應(yīng)用程序,而book下的book.asp則不屬于shop,他是一個新的web應(yīng) 用程序。
三:web應(yīng)用程序范圍的設(shè)置與應(yīng)用
如果你的開發(fā)環(huán)境是Visual InterDev6.0,那么,應(yīng)用程序的設(shè)置幾乎不用你費心去考慮,一切有VI6來給你設(shè)置好 了,并在IIS中自動建立了虛擬目錄,但如果是其他的話,你可能需要在IIS中自己去設(shè)定他。具體步驟如下: 創(chuàng)建應(yīng)用程序 1--在“Internet 服務(wù)管理器”中,選擇作為應(yīng)用程序啟動點的目錄。可以將 Web 站點的主目錄指定為 應(yīng)用程 序的啟動點。 2--打開該目錄的屬性頁,然后單擊“主目錄”、“虛擬目錄”或“目錄”選項卡。 3--在“名稱”文本框中,為應(yīng)用程序鍵入名稱。'當(dāng)然,應(yīng)用程序的名稱也不是必要的。但推薦設(shè)定。 4--單擊“創(chuàng)建”按鈕。 此后,你就可以將你的web應(yīng)用程序目錄映射到該目錄下即可。 明白以上的基本定義,對我們網(wǎng)絡(luò)開發(fā)人員十分必要,應(yīng)為,正是由于有了一個web應(yīng)用程序的范圍,才可以使web應(yīng)用 程序能夠在應(yīng)用程序的文件間共享信息,例如,ASP 應(yīng)用程序可在其網(wǎng)頁間共享環(huán)境流、會話狀態(tài)和變量設(shè)置。也就是我 們經(jīng)常使用的session,application對象等。應(yīng)為只有規(guī)定了一個應(yīng)用程序及其范圍,session,application等對象才有意 義。
四:session變量“丟失”的問題
談到了那么多的概念,終于可以說道實質(zhì)性的問題了,session對象是web應(yīng)用程序中最重要的對像之一,正是它的存 在,使得我們可以在跨網(wǎng)頁間傳送數(shù)據(jù),分辨不同用戶成為可能。我們只要將變量制定給session即可實現(xiàn)。這一過程即 session("temp")=temp即可。但最近不少網(wǎng)友都有這樣的疑問,就是當(dāng)我們在一個網(wǎng)頁間設(shè)定了一個session變量后,到另 一個網(wǎng)頁,卻消失了。這是什么樣的原因呢。 根據(jù)上面的概念,我們可以將其原因,和處理辦法總結(jié)如下。 1:asp網(wǎng)頁跨了多個web應(yīng)用程序: 這個原因就是你的另一個網(wǎng)頁可能是另一個web應(yīng)用程序。以前,一些資料過分的強調(diào)了會話變量的單一性,好像一個 用戶連接到一個web主機之后,只可能創(chuàng)建一個會話變量,這是不對的,分辨會話變量的依據(jù)正是我們上面所提到的web應(yīng) 用程序范圍,而不是單獨根據(jù)用戶而建立的,你可以試一試下面的一段代碼。 test.asp <% @ language=vbscript %> <% session("temp")="temp" Response.Write session.SessionID 'sessionID用來分辨一個應(yīng)用程序間的單獨客戶。 %>
將test.asp分別拷貝到兩個不同的虛擬目錄下。你就可以看到,他是兩個不同的值了。所以,可能你的網(wǎng)頁跨了不同的應(yīng) 用程序。 當(dāng)然,這種情況對于初學(xué)者可能碰到,對于有經(jīng)驗的人可能犯的是這樣的錯誤,即他們本身為一個根目錄,但在制定虛 擬目錄時將其子目錄又設(shè)為一個虛擬目錄了,就如同我們上面提到的第二個表結(jié)構(gòu)一樣。這樣他同樣成為了兩個不同的web 應(yīng)用程序。也就不難解釋為什么會出錯了。
2:可能是啟動了多個同一應(yīng)用程序。 第一種情況很好發(fā)現(xiàn),也容易改正,但這第二種情況就不容易發(fā)現(xiàn),也較難改正。這里我們引入一個另一個的概念。多 個同一應(yīng)用程序共存,(好長呀,關(guān)鍵是微軟的概念我忘了,這個是我自己起的。呵呵!),它的意思從這個定義上很好 理解,就是對于同一個應(yīng)用程序。同一時間可以在內(nèi)存中存在多個。如我們常見的acdsee.exe,你可以通過點擊啟動多個 acdsee.exe。而另外一種則不能,我們就不說它的定義了(如果說的話,就是相同應(yīng)用程序不共存,呵呵!)在同一時間 內(nèi),如果已經(jīng)啟動了一個應(yīng)用程序,則不能再啟動相同的應(yīng)用的應(yīng)用程序了。如foxmail.exe,當(dāng)你啟動了一個 foxmail.exe后,就只可能在內(nèi)存中存在一個foxmail.如果你在啟動,則不會再開一個foxmail窗口了。 而我們的ie屬于前者,你可以通過點擊ie,啟動多個ie應(yīng)用程序。此時,我們做下面另一個測試。你將上面的代碼 test.asp放入一個虛擬目錄中。然后,你點擊ie啟動(注意:是通過點擊Ie啟動,不是按CTRL+N,也不是在一個ie窗口點 擊文件,重新打開一個窗口)此時,你可以發(fā)現(xiàn),他們雖然是同一個地址,同一個用戶,但sessionID還是不同的,當(dāng)然, 你還可以建另一個文件。如 test2.asp <% @ language=vbscript %> <% response.write session("temp") %> 這時,你在另一個ie窗口下,你就會發(fā)現(xiàn)session("temp")為空,也就是說,我們剛才明明在test.asp中附了值,而且 test2.asp和test.asp在同一虛擬目錄下,但session("temp")卻丟失了。原來,相對于相同的asp應(yīng)用程序。不同的ie相對 的卻是不同的asp應(yīng)用程序。(有點像繞口令難懂是吧。)不過,我們已經(jīng)明白了它的起因,相信不難解決他。 這里還要注意的是,我們剛才一再提到的是通過點擊Ie,而不是通過按CTRL+N,也不是在一個ie窗口點擊文件,重新 打開一個窗口,這里要說明的是如果你通過在一個ie窗口打開的窗口,它屬于派生窗口,而不是共生窗口,就是說,此時 的另一個窗口屬于和其上一個窗口是繼承關(guān)系,屬于同一個應(yīng)用程序范圍。 3:連接不當(dāng) 其實,大部分的網(wǎng)友碰到的問題是通過點擊頁面中的連接新開窗口而發(fā)現(xiàn)session變量丟失的。他同按ctrl+N新開窗口 的意義相同。但此時為什么會出問題呢?我們來分析一下它的連接方式。可能為<a href="xx.asp" traget=_blank>click me </a>通過這樣點擊的連接同ctrl+n 是相同的,應(yīng)該不會出問題。還有一種連接式通過腳本控制的如 window.open "xx.asp","name","toolbar=no"這樣的代碼,他就可能發(fā)生這樣的問題。如果通過點擊ie開了多個共生窗口 (許多網(wǎng)友為了節(jié)省時間,他們喜歡開多個窗口。比如我。)。就是他可能在新開的窗口中如果含有相同的name的窗口。 則此時,就可能發(fā)生連接不當(dāng)導(dǎo)致session丟失,其實,原因還是通第二種一樣。還有一種更極端的方式開新窗口,通過用 document.write 在一個腳本中動態(tài)寫出新的頁面,而該頁面的url是不存在的,這樣就更可能出問題了,應(yīng)為session正是 通過url,http來追蹤的。所以如果其頁面地址是動態(tài)的話。則session就根本無法追蹤了。
相信通過以上例子的分析,可能會解釋你在應(yīng)用session中出現(xiàn)的大部分問題。但不是全部(如過你禁用cookie的話, 呵呵!)但是,如果你將以上的概念都弄懂,則可以解決你在應(yīng)用session中出現(xiàn)的所用問題了。
|