全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:2617
推到 Plurk!
推到 Facebook!

關於web應用程式的範圍與session變數丟失問題的深入研究

 
jackkcg
站務副站長


發表:891
回覆:1050
積分:848
註冊:2002-03-23

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

Delphi K.Top的K.Top分兩個字解釋Top代表尖端的意思,希望本討論區能提供Delphi的尖端新知
K.表Knowlege 知識,就是本站的標語:Open our mind
系統時間:2024-03-29 23:57:59
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!