第5章-Web應(yīng)用的狀態(tài)管理_第1頁
第5章-Web應(yīng)用的狀態(tài)管理_第2頁
第5章-Web應(yīng)用的狀態(tài)管理_第3頁
第5章-Web應(yīng)用的狀態(tài)管理_第4頁
第5章-Web應(yīng)用的狀態(tài)管理_第5頁
已閱讀5頁,還剩54頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

第5章

Web應(yīng)用的狀態(tài)管理內(nèi)容Web應(yīng)用狀態(tài)概述客戶端狀態(tài)維護技術(shù)服務(wù)器端狀態(tài)維護技術(shù)HTTP協(xié)議——“無狀態(tài)的協(xié)議”Web服務(wù)器每分鐘對上千個用戶進行管理的一種方式就是執(zhí)行所謂的“無狀態(tài)”連接。只要有一個希望瀏覽器返回一個頁面、圖像或其他資源的請求,就發(fā)生以下事情:連接到服務(wù)器告訴服務(wù)器想要的頁面、圖像或其他項服務(wù)器發(fā)送請求資源服務(wù)器切斷連接,把用戶忘得干干凈凈。ASP.NetWebForm的“連續(xù)”和“有狀態(tài)”的假象ASP.NET的設(shè)計者們,從實際訪問者的角度重新考慮了這一過程:訪問者打開一個頁面,點擊一個按鈕,看到新的畫面……這一切似乎都是連續(xù)的。狀態(tài)管理Web應(yīng)用本質(zhì)上是無狀態(tài)的,如需保存狀態(tài)則需要做狀態(tài)管理,狀態(tài)維護是對同一頁或不同頁的多個請求維護狀態(tài)和頁信息的過程,保持用戶信息(狀態(tài))的連續(xù)性。狀態(tài)管理狀態(tài)維護技術(shù)視圖狀態(tài):使用一個或多個隱藏域來保存控件的狀態(tài)。控件狀態(tài):當(dāng)開發(fā)自定義控件時,保存控件的狀態(tài)數(shù)據(jù)。隱藏域:標(biāo)準(zhǔn)的HTML隱藏域。Cookie:用于在客戶端保存少量的數(shù)據(jù)。查詢字符串:查詢字符串是在頁URL的結(jié)尾附加的信息。應(yīng)用程序狀態(tài):用于保存服務(wù)器端的全局應(yīng)用程序信息。會話狀態(tài):保存會話狀態(tài)信息。配置文件屬性:ASP.NET提供了一個稱為配置文件屬性的功能,可以保存服務(wù)器端的全局應(yīng)用程序信息??蛻舳藸顟B(tài)管理客戶端狀態(tài)管理不如服務(wù)器端狀態(tài)管理選項安全不如服務(wù)器端管理選項可靠可存儲的信息量可能受到限制用戶可以刪除Cookie惡意的用戶可通過某些方法來篡改或讀取其中的內(nèi)容Web服務(wù)器客戶端計算機客戶端狀態(tài)信息服務(wù)器端狀態(tài)管理可通過應(yīng)用程序狀態(tài)(Application)、會話狀態(tài)(Session)、配置文件、數(shù)據(jù)庫保存會話狀態(tài)來實現(xiàn)Web服務(wù)器客戶端計算機服務(wù)器端狀態(tài)信息SessionID客戶端狀態(tài)維護技術(shù)視圖狀態(tài)隱藏域查詢字符串Cookie視圖狀態(tài)視圖狀態(tài)概述設(shè)置頁面是否保留視圖狀態(tài)在配置文件設(shè)置是否保留視圖狀態(tài)設(shè)置頁面是否保留視圖狀態(tài)設(shè)置@Page指令或Page的EnableViewState屬性指示當(dāng)前頁請求結(jié)束時,該頁是否保持其視圖狀態(tài)以及它包含的任何服務(wù)器控件的視圖狀態(tài)關(guān)閉頁面的視圖狀態(tài)設(shè)置頁面是否保留視圖狀態(tài)(例)關(guān)閉頁面的視圖狀態(tài)<%@PageEnableViewState="false"%>protectedvoidPage_Load(objectsender,EventArgse){Page.EnableViewState=false;}<asp:GridViewID="GridView1"runat="server"EnableViewState="false"></asp:GridView>在配置文件中設(shè)置是否保留視圖狀態(tài)在配置文件Web.config的system.web節(jié)點下,修改Pages元素的EnableViewState屬性,來控制所有頁面是否啟用視圖狀態(tài)信息<system.web> <!><pagesenableViewState="false"></pages></system.web>對視圖狀態(tài)進行分塊設(shè)置頁的MaxPageStateFieldLength屬性,對ViewState屬性中存儲的數(shù)據(jù)進行分塊,可以在Web.config文件中設(shè)置分塊大小<pagesenableViewState="true"maxPageStateFieldLength="100"></pages>使用視圖狀態(tài)存取數(shù)據(jù)

視圖狀態(tài)(ViewState)是一個字典對象,通過Page類的ViewState屬性公開,是頁用來在往返行程之間保留頁和控件屬性值的默認方法(只在本頁有效)視圖狀態(tài)可存儲的數(shù)據(jù)類型:字符串;整數(shù);布爾值;Array和ArrayList對象;哈希表;自定義類型轉(zhuǎn)換器ViewState["view1"]="HelloWorld";【例5-1】視圖狀態(tài)示例程序。使用視圖狀態(tài)具有以下3個優(yōu)點:耗費的服務(wù)器資源較少(與Application、Session相比)。因為,視圖狀態(tài)數(shù)據(jù)都寫入了客戶端計算機中。易于維護。默認情況下,.NET系統(tǒng)自動啟用對控件狀態(tài)數(shù)據(jù)的維護。增強的安全功能。視圖狀態(tài)中的值經(jīng)過哈希計算和壓縮,并且針對Unicode實現(xiàn)進行編碼,其安全性要高于使用隱藏域。使用視圖狀態(tài)具有以下3個缺點:性能問題。由于視圖狀態(tài)存儲在頁本身,因此如果存儲較大的值,用戶顯示頁和發(fā)送頁時的速度可能減慢。設(shè)備限制。移動設(shè)備可能沒有足夠的內(nèi)存容量來存儲大量的視圖狀態(tài)數(shù)據(jù)。因此,對于移動設(shè)備上的服務(wù)器控件,將使用其它的實現(xiàn)方法。潛在的安全風(fēng)險。視圖狀態(tài)存儲在頁上的一個或多個隱藏域中。雖然視圖狀態(tài)以哈希格式存儲數(shù)據(jù),但它可以被篡改。如果在客戶端直接查看頁源文件,可以看到隱藏域中的信息,這導(dǎo)致潛在的安全性問題??珥撎峤籔reviousPage使用隱藏域隱藏域是一個存儲庫,直接存儲在頁中的任何特定于頁的信息,在視圖狀態(tài)、會話狀態(tài)和Cookie等方法被禁用或不可用,則可以使用HiddenField控件來存儲狀態(tài)值隱藏域的設(shè)置和讀取<asp:HiddenFieldID="h1"runat="server"/>protectedvoidPage_Load(objectsender,EventArgse){stringstrUserName="Jakey";h1.Value=strUserName;}查詢字符串查詢字符串提供了一種維護狀態(tài)信息的方法,輸入查詢字符串以問號(?)開始的屬性/值對,且可以有多個查詢字符串,它們之間以“&”分隔/listwidgets.aspx?category=basic&price=100【例5-2】演示查詢字符串的使用。使用查詢字符串的優(yōu)點:不需要任何服務(wù)器資源。查詢字符串包含在對特定URL的HTTP請求中。廣泛的支持。幾乎所有的瀏覽器和客戶端設(shè)備均支持使用查詢字符串傳遞值。實現(xiàn)簡單。ASP.NET完全支持查詢字符串方法,其中包含了使用HttpRequest對象的Params屬性讀取查詢字符串的方法。使用查詢字符串的缺點:潛在的安全性風(fēng)險。用戶可以通過瀏覽器直接看到查詢字符串中的信息。用戶可將此URL設(shè)置為書簽或發(fā)送給別的用戶,從而通過此URL傳遞查詢字符串中的信息。有限的容量。有些瀏覽器和客戶端設(shè)備對URL的長度有2083個字符的限制。CookieCookie概述編寫Cookie演示和練習(xí):編寫Cookie編寫多值Cookie演示和練習(xí):編寫多值Cookie控制Cookie的范圍演示和練習(xí):控制Cookie的范圍修改和刪除Cookie演示和練習(xí):刪除Cookie和刪除多值Cookie的子鍵Cookie和會話狀態(tài)Cookie概述Cookie是存儲在客戶端文件系統(tǒng)的文本文件中,或者存儲在客戶端瀏覽器會話的內(nèi)存中的少量的數(shù)據(jù)Cookie是隨頁輸出并由服務(wù)器發(fā)送到客戶端的特定于站點的信息Cookie可以是臨時的(隨著瀏覽器關(guān)閉而自動消失),也可以是永久性的Cookie保存在客戶端設(shè)備上,當(dāng)瀏覽器請求某頁時,客戶端會將Cookie中的信息連同請求信息一起發(fā)送。服務(wù)器可以讀取Cookie的值Cookie的用途用戶的個人配置登錄和“rememberme”彈出窗口編寫Cookie使用HttpResponse對象來設(shè)置Cookie,需要設(shè)置Cookie名稱、值、過期時間等信息//通過新建HttpCookie對象來添加CookieHttpCookieaCookie=newHttpCookie("lastVisit"); //新建HttpCookie對象aCookie.Value=DateTime.Now.ToString();aCookie.Expires=DateTime.Now.AddDays(1); //設(shè)置Cookie的過期Response.Cookies.Add(aCookie); //將Cookie添加到Cookies集合//讀取Cookie值stringuserName;if(Request.Cookies["userName"]!=null){userName=Request.Cookies["userName"].Value;}編寫多值Cookie在一個Cookie中存儲多個名稱/值對,名稱/值對稱為子鍵//直接添加CookieResponse.Cookies["userInfo"]["userName"]="patrick";Response.Cookies["userInfo"]["lastVisit"]=DateTime.Now.ToString();Response.Cookies["userInfo"].Expires=DateTime.Now.AddDays(1);//讀取Cookie值stringuserName;if(Request.Cookies["userName"]!=null){if(Request.Cookies["userInfo"]["userName"]!=null){userName=Request.Cookies["userInfo"]["userName"];}}控制Cookie的范圍限制Cookie的域范圍將Cookie限制到某個文件夾或應(yīng)用程序控制Cookie的范圍限制Cookie的域范圍Response.Cookies["domain"].Value=DateTime.Now.ToString();Response.Cookies["domain"].Expires=DateTime.Now.AddDays(1);Response.Cookies["domain"].Domain="support.";控制Cookie的范圍將Cookie限制到某個文件夾或應(yīng)用程序HttpCookieappCookie=newHttpCookie("AppCookie");appCookie.Value="written"+DateTime.Now.ToString();appCookie.Expires=DateTime.Now.AddDays(1);appCookie.Path="/App1";Response.Cookies.Add(appCookie);修改和刪除Cookie由于Cookie存儲在客戶端,不能直接修改和刪除Cookie通過給Cookie賦新值替換舊版本Cookie的辦法來修改可以通過設(shè)置Cookie立即過期的辦法來刪除CookieCookie的應(yīng)用一般只要有會員、用戶機制的網(wǎng)站或論壇在登錄的時候都會有這么一個復(fù)選框——[記住我的名字|兩周內(nèi)不再登錄|在此計算機上保存我的信息],說法較多,實現(xiàn)起來差不多,下面就來實現(xiàn)這樣一個簡單的例子。【例5-3】演示Cookie的使用。服務(wù)器端狀態(tài)維護技術(shù)會話狀態(tài)應(yīng)用程序狀態(tài)會話狀態(tài)會話標(biāo)識符配置會話狀態(tài)

會話狀態(tài)事件會話狀態(tài)變量的使用

會話狀態(tài)的利弊

會話狀態(tài)是ASP.NET中非常重要的服務(wù)器端狀態(tài)管理技術(shù),同時也是功能很強大的狀態(tài)管理技術(shù)。會話狀態(tài)是特定于用戶的,當(dāng)一個用戶開始訪問Web應(yīng)用程序時,將會產(chǎn)生一個會話狀態(tài)。不同的用戶具有不同的會話狀態(tài),如果有一萬個用戶,將會有一萬個會話狀態(tài)。會話狀態(tài)在存儲與用戶相關(guān)的信息方面非常有用,如博客登錄后就可以使用會話狀態(tài)存儲通過驗證的用戶信息。會話標(biāo)識符瀏覽器的會話使用存儲在SessionID屬性中的唯一標(biāo)識符進行標(biāo)識會話ID使ASP.NET應(yīng)用程序能夠?qū)⑻囟ǖ臑g覽器與Web服務(wù)器上相關(guān)的會話數(shù)據(jù)和信息相關(guān)聯(lián)會話ID的值在瀏覽器和Web服務(wù)器間通過Cookie進行傳輸,如果指定了無Cookie會話,則通過URL進行傳輸會話標(biāo)識符無Cookie的SessionID將Web.config文件的sessionState節(jié)的cookieless屬性設(shè)置為true,可以指定不將會話標(biāo)識符存儲在Cookie中,而是存儲在URL中<configuration><system.web><sessionStatecookieless="true"/></system.web></configuration>http://localhost:10765/StateManageDemo/(S(hfuvhje2whhmnhyaocja54r0))/Default.aspx會話標(biāo)識符配置會話狀態(tài)

會話狀態(tài)模式概述ASP.NET會話狀態(tài)支持若干用于會話數(shù)據(jù)的存儲選項在Web.config文件中為sessionState元素的mode屬性分配一個SessionStateMode枚舉值,可以指定ASP.NET會話狀態(tài)使用的模式配置會話狀態(tài)(續(xù))

InProc模式(進程內(nèi)模式)是默認會話狀態(tài)模式,使用SessionStateMode枚舉的InProc值指定進程內(nèi)模式將會話狀態(tài)值和變量存儲在本地Web服務(wù)器的內(nèi)存中是唯一支持Session_End事件的模式配置會話狀態(tài)(續(xù))

StateServer模式(狀態(tài)服務(wù)器模式)會話狀態(tài)存儲在一個稱為ASP.NET狀態(tài)服務(wù)的進程中,該進程是獨立于ASP.NET輔助進程或IIS應(yīng)用程序池的單獨進程使用此模式可以確保在重新啟動Web應(yīng)用程序時保留會話狀態(tài),并使會話狀態(tài)可用于網(wǎng)絡(luò)場中的多個Web服務(wù)器<configuration><system.web><sessionStatemode="StateServer"stateConnectionString="tcpip=SampleStateServer:42424"cookieless="false"timeout="20"/></system.web></configuration>配置會話狀態(tài)

(續(xù))

SQLServer模式會話狀態(tài)存儲到一個SQLServer數(shù)據(jù)庫中可以確保在重新啟動Web應(yīng)用程序時保留會話狀態(tài),并使會話狀態(tài)可用于網(wǎng)絡(luò)場中的多個Web服務(wù)器<configuration><system.web><sessionStatemode="SQLServer"sqlConnectionString="IntegratedSecurity=SSPI;datasource=SampleSqlServer;"/></system.web></configuration>配置會話狀態(tài)(續(xù))

Custom摸式(自定義模式)指定使用自定義會話狀態(tài)存儲提供程序來存儲會話狀態(tài)數(shù)據(jù)在Web.config中配置sessionState的提供程序為自定義的會話狀態(tài)存儲提供程序Off模式:此模式禁用會話狀態(tài)。

會話狀態(tài)事件在Global.asax文件編寫用于管理用戶會話的事件:Session_Start事件:在新會話開始時觸發(fā)Session_End事件:在會話被放棄或過期時觸發(fā)Session_Start事件:通過向Global.asax文件添加一個名為Session_Start的事件過程來處理。如果請求開始一個新會話,Session_Start事件過程會在請求開始時運行。如果請求不包含SessionID值或請求所包含的SessionID屬性引用一個已過期的會話,則會開始一個新會話。可以使用Session_Start事件初始化會話變量并跟蹤與會話相關(guān)的信息。Session_End事件:通過向Global.asax文件添加一個名為Session_End的事件過程來處理。Session_End事件過程在調(diào)用Abandon方法或會話過期時運行。如果超過了某一會話Timeout屬性指定的分鐘數(shù)并且在此期間內(nèi)沒有請求該會話,則該會話過期。會話狀態(tài)變量的使用

向會話狀態(tài)添加項以鍵/值對形式直接向Session中添加項以持久保留值,并且根據(jù)添加的鍵名稱訪問會話狀態(tài)的值//添加 Session["UserName"]="mary";或: Session.Add("UserName","mary");//訪問If(Session["UserName"]!=null){stringstrUsername=Session["UserName"].ToString();}會話狀態(tài)變量的使用會話的過期配置會話過期時間,默認過期時間為20分鐘編寫代碼設(shè)置Session對象的Timeout屬性,來設(shè)置會話狀態(tài)過期時間voidSession_Start(objectsender,EventArgse){Session.Timeout=30;}<configuration><system.web><sessionStatemode="InProc"timeout="30"/></system.web></configuration>使用會話狀態(tài)刪除會話狀態(tài)中的項調(diào)用Session對象的Clear和RemoveAll方法來刪除會話狀態(tài)集合中的所有項調(diào)用Remove和RemoveAt刪除其中的某一項調(diào)用Abandon方法取消當(dāng)前會話,即會話立即過期Session.Remove("UserName");Session.Abandon();【例5-4】演示會話狀態(tài)變量的使用。會話狀態(tài)的利弊

使用會話狀態(tài)的優(yōu)點:實現(xiàn)簡單。會話特定的事件。數(shù)據(jù)持久性。平臺可伸縮性。無需Cookie支持??蓴U展性。使用會話狀態(tài)的缺點:使用會話狀態(tài)時,要注意其性能問題。

應(yīng)用程序狀態(tài)應(yīng)用程序狀態(tài)概述添加和讀取應(yīng)用程序狀態(tài)中的值演示和練習(xí):使用應(yīng)用程序狀態(tài)來存儲信息刪除應(yīng)用程序狀態(tài)的值應(yīng)用程序狀態(tài)概述應(yīng)用程序狀態(tài)是一種全局存儲機制,可以供Web應(yīng)用程序中的所有頁面(或Global.asax文件)訪問存儲在HttpApplicationState類的實例中,該類在客戶端第一次從某個特

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論