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

下載本文檔

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

文檔簡(jiǎn)介

第5章

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

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

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

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

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

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

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

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

(續(xù))

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

Custom摸式(自定義模式)指定使用自定義會(huì)話狀態(tài)存儲(chǔ)提供程序來(lái)存儲(chǔ)會(huì)話狀態(tài)數(shù)據(jù)在Web.config中配置sessionState的提供程序?yàn)樽远x的會(huì)話狀態(tài)存儲(chǔ)提供程序Off模式:此模式禁用會(huì)話狀態(tài)。

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

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

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

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

溫馨提示

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

評(píng)論

0/150

提交評(píng)論