異常處理和驗證控件_第1頁
異常處理和驗證控件_第2頁
異常處理和驗證控件_第3頁
異常處理和驗證控件_第4頁
異常處理和驗證控件_第5頁
已閱讀5頁,還剩36頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

異常處理和驗證控件第1頁,課件共41頁,創(chuàng)作于2023年2月本章內(nèi)容錯誤處理使用驗證服務(wù)控件第2頁,課件共41頁,創(chuàng)作于2023年2月5.1錯誤處理一.異常處理異常:發(fā)生不同類型的錯誤。拋出異常:系統(tǒng)或程序本身向外聲明一個異常發(fā)生。異常類:錯誤的種類,都是特定類的對象。錯誤頁面:一個特定的錯誤頁面。處理異常:出現(xiàn)錯誤時不希望只是出現(xiàn)錯誤頁面,而是能對錯誤直接處理。處理錯誤的方法(級別):

1.在類級

2.在頁面級

3.在應(yīng)用程序級第3頁,課件共41頁,創(chuàng)作于2023年2月二.在類級(程序中)使用try…catch語句塊處理異常try{doubledVal1=Convert.ToDouble(txtValue1.Text);doubledVal2=Convert.ToDouble(txtValue2.Text);doubleresult=dVal1/dVal2;labMessage.Text=txtValue1.Text+"/"+txtValue2.Text;labMessage.Text+="="+result;}catch(FormatExceptionex1){labMessage.Text="Pleaseenteravalidnumber";}catch(Exceptionex2){labMessage.Text="Unabletocomputeavaluewiththesevalues";}第4頁,課件共41頁,創(chuàng)作于2023年2月有時需要使用finally做最后的處理,無論是否發(fā)生異常。try{//Openadatabaseconnection//ExecuteSQLstatement}catch(DbExceptionex){//Handledatabaseexception}finally{//Closedatabaseconnectionifitexists}第5頁,課件共41頁,創(chuàng)作于2023年2月1.異常開銷不是多有的問題都需要使用異常來對待,如接受用戶數(shù)據(jù)的輸入。下面的處理方法并不是很合適:try{SomeBusinessObject.Login(email);

//Othercodedependentuponasuccessfullogin}catch(Exceptionex){//Displaymessagethatemailwasnotfound}使用下面的處理方法程序?qū)⒏咏眩篵oolokay=SomeBusinessObject.Login(email);if(!okay){//Displayerrormessageonpage}else{//Othercodedependentuponasuccessfullogin}第6頁,課件共41頁,創(chuàng)作于2023年2月2.可能的異常處理策略當(dāng)有異常出現(xiàn)時有四種處理策略:通過捕獲異常來吞掉它,并且繼續(xù)正常執(zhí)行而忽略異常。在catch語句塊中完全處理異常。不捕獲異常而忽略它(讓其他類來處理它)。捕獲異常并重新拋出它,以便某個其它的類來處理它。說明:第一種方法根本不合適。屬于典型的不負(fù)責(zé)任。第二種方法最理想,但難以做到,不是什么問題自己都能夠解決。第三種方法也比較多見,有時候自己無能力處理,只好交給別人處理。第四種方法也比較多見,根據(jù)情況進(jìn)行處理,并將錯誤上報。第7頁,課件共41頁,創(chuàng)作于2023年2月try{//Othercodethatcausesanexception}catch(Exceptionex){//Dosomethingwithexception//Rethrowexceptionthrow;

或thrownewException(myMessage,ex);}第8頁,課件共41頁,創(chuàng)作于2023年2月三.頁面級的異常處理ASP.NET提供了一個Page_Error事件,專門處理頁面級異常??聪旅娴氖吕?。publicpartialclassPageExceptionTest:System.Web.UI.Page{ protectedvoidPage_Load(objectsender,EventArgse){BuggyMethod();}privatevoidBuggyMethod(){//Deliberatelythrowanexceptiontosimulate//uncaughtexceptionthrownewApplicationException("Yourbuggycodecausedanexception.");}

privatevoidPage_Error(objectsender,EventArgse){Exceptionex=Server.GetLastError();Response.Write("<h1>Anerrorhasoccurred</h1>");Response.Write("<h2>"+ex.Message+"</h2>");Response.Write("<pre>"+ex.StackTrace+"</pre>");Context.ClearError();//防止缺省錯誤頁面顯示

}}Page_Error中不允許使用控件,所以只能使用Response.Write輸出數(shù)據(jù)。第9頁,課件共41頁,創(chuàng)作于2023年2月通常不使用Page_Error事件處理器,一般使用Application_Error處理器,它屬于應(yīng)用程序一級,比頁面級更有優(yōu)勢。第10頁,課件共41頁,創(chuàng)作于2023年2月四、應(yīng)用程序級的異常處理有兩種方法:使用Application_Error處理器使用錯誤頁面重定向1.使用Application_Error處理器Application_Error處理器比Page_Error更有優(yōu)勢,它能處理所有頁面級的錯誤。需要說明的是,Application_Error處理器定義在Global.asax文件中(可通過添加全局應(yīng)用程序類添加)。第11頁,課件共41頁,創(chuàng)作于2023年2月下面例子把接收到的任何異常輸出到WindowsEventLog,可通過事件查看器瀏覽。voidApplication_Error(objectsender,EventArgse){ stringmsg="Url"+Request.Path+"Error:"+ Server.GetLastError().ToString(); try{//createtheWebErrorseventsourceifweneedtostringlogName="WebErrors";

if(!EventLog.SourceExists(logName))EventLog.CreateEventSource(logName,logName);//addanewerroreventtothelogEventLoglog=newEventLog();log.Source=logName;log.WriteEntry(msg,EventLogEntryType.Error);}catch(Exceptionex){//notmuchwecandowiththisexceptoutputittodebuggerDebug.WriteLine(ex.Message);}}第12頁,課件共41頁,創(chuàng)作于2023年2月也可以把錯誤形成郵件發(fā)送到指定的郵件中或把信息記錄到自定義文件中。見教材P180。第13頁,課件共41頁,創(chuàng)作于2023年2月2.使用自定義錯誤頁面如果在Page_Error和Application_Error中不使用Context.ClearError方法,則錯誤會重定向到缺省的錯誤頁面。錯誤的頁面在開發(fā)環(huán)境和非開發(fā)環(huán)境下是不同的,開發(fā)環(huán)境下可以看到錯誤的詳細(xì)信息。也可以將錯誤頁面重定向到一個自定義的頁面,這需要修改配置文件。<system.web><customErrors

mode="On"defaultRedirect="FriendlyErrorPage.aspx"><error

statusCode="404"redirect="custom404.aspx"/><error

statusCode="500"redirect="custom500.aspx"/></customErrors></system.web>第14頁,課件共41頁,創(chuàng)作于2023年2月5.2使用驗證服務(wù)器控件驗證控件用來測試用戶的輸入并設(shè)置輸入是否通過測試的屬性。驗證控件需要引用頁面上其他的輸入控件。在用戶輸入時,ASP.NET頁框架將用戶輸入傳遞到一個或多個適當(dāng)?shù)尿炞C控件,由驗證控件對輸入的信息進(jìn)行驗證。ASP.NET提供了五種基本的驗證類型控件和一個驗證總結(jié)控件(ValidationSummary),它們分別由不同的驗證控件來實現(xiàn)。第15頁,課件共41頁,創(chuàng)作于2023年2月驗證控件控件名稱說明RequiredFieldValidator確保輸入控件的值不為空,即必須輸入了數(shù)據(jù)CompareValidator使用比較運算符(小于、等于、大于等)將用戶的輸入與另一控件的常數(shù)值或?qū)傩灾颠M(jìn)行比較。RangeValidator檢查用戶的輸入是否在指定的上下邊界之間??梢詸z查數(shù)字、字母或日期對內(nèi)的范圍??梢詫⑦吔绫硎緸槌?shù)。RegularExpressionValidator檢查輸入是否與正則表達(dá)式定義的模式匹配。該驗證類型允許檢查可預(yù)知的字符序列,如社會保障號、電子郵件地址、電話號碼、郵政編碼等中的字符序列。CustomValidator使用您自己編寫的驗證邏輯檢查用戶的輸入。ValidationSummary以摘要的形式顯示頁上所有驗證程序的驗證錯誤。第16頁,課件共41頁,創(chuàng)作于2023年2月下面展示了RequiredFieldValidator控件的使用<asp:TextBoxID="txtUserName"runat="server"/><asp:RequiredFieldValidatorId="reqUser"runat="server"

ControlToValidate="txtUserName"

Text="PleaseenteraUserName"/>其中兩個重要屬性ControlToValidate用來建立關(guān)聯(lián),Text顯示錯誤提示。第17頁,課件共41頁,創(chuàng)作于2023年2月一、表單驗證過程表單數(shù)據(jù)的驗證包括客戶端驗證和服務(wù)器端驗證客戶端驗證:瀏覽器通過本地JavaScript腳本進(jìn)行驗證,不需要與服務(wù)器交互,減少往返時間。效率高。服務(wù)器端驗證:有些驗證必須在服務(wù)器端進(jìn)行,因為需要與服務(wù)器上的數(shù)據(jù)進(jìn)行比較。兩種驗證不是絕對分開的。有時因為客戶端不支持,客戶端驗證可能行不通,另外也存在一定的風(fēng)險(存在腳本漏洞)。所以服務(wù)器端驗證會更加安全。第18頁,課件共41頁,創(chuàng)作于2023年2月1.客戶端驗證過程客戶端驗證就是驗證的程序是在客戶端執(zhí)行,即控件轉(zhuǎn)換成相關(guān)的HTML元素和一些JavaScript程序,例如RequiredFieldValidator控件轉(zhuǎn)換后會有許多JavaScript代碼。見實例:ValidationSample.aspx UsingRequired.aspx可通過在瀏覽器查看源代碼,觀察生成的JavaScript代碼。第19頁,課件共41頁,創(chuàng)作于2023年2月2.服務(wù)器端驗證過程服務(wù)器端的驗證需要在服務(wù)器端編寫相關(guān)驗證程序。有時除了控件本身的驗證以外,還需要編寫一定的程序進(jìn)行數(shù)據(jù)的檢查,例如和數(shù)據(jù)庫內(nèi)容的匹配比較,檢查用戶名是否已注冊等。見第5章實例:DisableClientValidation.aspx注意:Page.IsValid是頁面的屬性,當(dāng)為tue時,說明客戶端控件合法,即驗證控件驗證通過。第20頁,課件共41頁,創(chuàng)作于2023年2月3.常用驗證屬性ControlToValidate:控件IDDisplay:錯誤消息的顯示行為。可能的值是:None(不顯示驗證消息),Static(占用固定的空間并顯示錯誤消息),Dynamic(只有當(dāng)有錯誤消息時分配空間并顯示消息).缺省值是Static.EnableClientScript:指示客戶端驗證是否可用.缺省值是true.Enabled:驗證控件是否可用ErrorMessage:驗證失效,將要顯示在ValidationSummary控件中的錯誤消息文本.ForeColor:驗證實效,將要顯示錯誤文本的顏色。缺省為Color.Red.IsValid:驗證失效是否傳遞它的驗證檢查,一般通過程序檢驗時設(shè)置。SetFocusOnError:驗證失敗,焦點是否移動到相關(guān)控件。缺省為false.Text:驗證失敗時顯示的錯誤信息.ValidationGroup:指定驗證控件所屬的驗證組的名字.第21頁,課件共41頁,創(chuàng)作于2023年2月二、RequiredFieldValidator控件RequiredFieldValidator控件用于在Web窗體頁面上保證用戶非空輸入,即對必填數(shù)據(jù)項已輸入數(shù)據(jù)而不會跳過。相關(guān)屬性:ControlToValidate屬性:設(shè)置相關(guān)聯(lián)控件。Display屬性:設(shè)置顯示方式,默認(rèn)為Static,可設(shè)置為Dynamic以保證多個相關(guān)聯(lián)驗證控件的顯示信息都能動態(tài)地顯示相關(guān)信息(即位置不固定)。ErrorMessages屬性:顯示的提示信息!InitialValue屬性:初始值,如果輸入控件的值與該值匹配,則驗證失敗。見實例:UsingRequired.aspx第22頁,課件共41頁,創(chuàng)作于2023年2月三、CompareValidator驗證控件

比較兩個控件的輸入是否符合程序設(shè)定。同樣該控件也必須設(shè)置一個需要驗證的控件與之關(guān)聯(lián)。如比較兩次輸入的口令是否一致。CompareValidator相關(guān)屬性ControlToValidate:需比較的控件之一。ControlToCompare:比較的控件之二(可省,使用屬性ValueToCompare)Operator:定義要執(zhí)行的比較類型。包括:EqualNotEqualGreaterThanGreaterThanEqualLessThanLessThanEqualDataTypeCheck檢查數(shù)據(jù)類型是否與Type屬性指定的類型一致。Type:分為String、Integer、Double、Date和Currency。ErrorMessage:設(shè)置當(dāng)驗證失敗時出現(xiàn)的錯誤信息。ValueToCompare:指定控件將要比較的常量見實例:UsingCompare.aspx第23頁,課件共41頁,創(chuàng)作于2023年2月四、RangeValidator驗證控件用于計算輸入控件的值,以確定該值是否在指定的上限與下限之間。RangeValidator相關(guān)屬性ControlToValidate屬性:指定要驗證的輸入控件。MinimumValue和MaximumValue屬性:分別指定有效范圍的最小值和最大值。Type屬性:用于指定要比較的值的數(shù)據(jù)類型。在執(zhí)行任何比較之前,先將要比較的值轉(zhuǎn)換為該數(shù)據(jù)類型。類型同前。見實例:UsingRange.aspx第24頁,課件共41頁,創(chuàng)作于2023年2月五、RegularExpressionValidator驗證控件用于確定輸入控件的值是否與某個正則表達(dá)式所定義的模式相匹配。該驗證類型允許檢查可預(yù)知的字符序列,如身份證號、電子郵件地址、電話號碼、郵政編碼等中的字符序列。RegularExpressionValidator相關(guān)屬性:屬性ValidationExpression指定用于驗證輸入控件的正則表達(dá)式。正則表達(dá)式是一種語言,它可以明確描述文本字符串中的模式。通過特定的表達(dá)式語法規(guī)則驗證表達(dá)式的合法性。例如:下面是正則表達(dá)式的一些示例

http(s)?://([\w-]+\.)+[\w-]+(/[\w-./?%&=]*)?用于驗證InternetURL\w+([-+.']\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*用于驗證EMAL[a-zA-Z]{4,8}必須為英文字母,最少四個字符,最多八個字符

\d{6}6位的整型數(shù)據(jù)

ASP.NET關(guān)于正則表達(dá)式的說明見P195。在有些網(wǎng)站提供相關(guān)資源。見實例:UsingRegExp.aspx第25頁,課件共41頁,創(chuàng)作于2023年2月使用正則表達(dá)式1.使用RegEx類有時需要在程序中使用正則表達(dá)式,通過程序來對數(shù)據(jù)進(jìn)行驗證。這就需要使用到RegEx類。RegEx類包含在System.Text.RegularExpressions命名空間。見教材實例:ScrapeHeadings.aspx注意:實例對于中文頁面將顯示亂碼,需要增加第二行的語句:WebClientclient=newWebClient();client.Encoding=Encoding.UTF8;stringcontent=client.DownloadString(txtUrl.Text);第26頁,課件共41頁,創(chuàng)作于2023年2月2.正則表達(dá)式和安全SQL注入攻擊是常見的一種服務(wù)器攻擊手段。利用網(wǎng)站合法的SQL語句進(jìn)行注入,以達(dá)到竊取數(shù)據(jù)的、控制服務(wù)器的目的。例如,認(rèn)證網(wǎng)頁中會有型如:

select*fromadminwhereusername='XXX'and password='YYY'

的語句,若在正式運行此句之前,沒有進(jìn)行必要的字符過濾,則很容易實施SQL注入。如在用戶名文本框內(nèi)輸入: abc’or1=1

在密碼框內(nèi)輸入:123則SQL語句變成:

select*fromadminwhereusername='abc’or1=1andpassword='123’

不管用戶輸入任何用戶名與密碼,此語句永遠(yuǎn)都能正確執(zhí)行,用戶輕易騙過系統(tǒng),獲取合法身份。防止注入的有效方法是對用戶輸入的數(shù)據(jù)進(jìn)行驗證,確保數(shù)據(jù)是合法的。第27頁,課件共41頁,創(chuàng)作于2023年2月看下面的示例<asp:TextBoxID="txtName"runat="server"></asp:TextBox><asp:RegularExpressionValidatorID="regName"runat="server"ControlToValidate="txtName"ValidationExpression="^[a-zA-Z'.\s]{1,50}"Text="Enteravalidname"/>

此處對輸入的數(shù)據(jù)做了要求,即匹配任何小寫字母大寫字母、單引號、逗點、空格,最少1個,最多50個字符。第28頁,課件共41頁,創(chuàng)作于2023年2月也可以在程序中作出檢驗stringsource=(string)Cookie["someValue"];RegExreg=newRegEx("^[a-zA-Z'.\s]{1,50}");if(!reg.IsMatch(source)){//Sometypeoferrorhandlingwouldgohere}第29頁,課件共41頁,創(chuàng)作于2023年2月六、CustomValidator控件自定義驗證邏輯,需要創(chuàng)建一個服務(wù)器端驗證函數(shù)用于執(zhí)行驗證。如驗證注冊用戶名在數(shù)據(jù)庫中是否已經(jīng)存在。用戶可以雙擊CustomValidator控件,也可以雙擊該控件的ServerValidate事件來完成自定義驗證的代碼。看下面的示例:

第30頁,課件共41頁,創(chuàng)作于2023年2月下面這段代碼是用戶用于驗證數(shù)據(jù)庫里的學(xué)生學(xué)號是否存在的函數(shù)。protectedvoidCustomValidator1_ServerValidate(objectsource,ServerValidateEventArgsargs){SqlConnectionconn=newSqlConnection("DataSource=LDB;InitialCatalog=Students;UserID=sa");conn.Open();intStuNO=args.Value;SqlCommandcmd=newSqlCommand("selectcount(*)fromstudentwherestuid="+StuNO,conn);intcount=Convert.ToInt32(cmd.ExecuteScalar());

if(count>0){args.IsValid=false;}else{args.IsValid=true;}}第31頁,課件共41頁,創(chuàng)作于2023年2月下面方法檢查用戶輸入的是否是一個有效的未來日期protectedvoidcustDate_ServerValidate(objectsource,ServerValidateEventArgsargs){ stringsEnteredDate=args.Value; DateTimedt; boolconvertSuccessful=DateTime.TryParse(sEnteredDate,outdt); if(convertSuccessful&&dt>=DateTime.Today) args.IsValid=true;//validdateelse args.IsValid=false;//notavaliddate}args對象包含兩個屬性,Value保存了將要驗證控件的字符串,IsValid用來設(shè)置輸入是否有效。第32頁,課件共41頁,創(chuàng)作于2023年2月下面例子實現(xiàn)了對兩個文本框的驗證。Enterusername:<br/><asp:TextBoxID="txtUser"runat="server"/><br/>Enteremail:<br/><asp:TextBoxID="txtEmail"runat="server"/><asp:CustomValidatorID="OrFieldValidator"runat="server"Text="Entereitherausernameoraemail"OnServerValidate="OrFieldValidator_ServerValidate"/>上面兩個文本框只用了一個驗證控件,下面是驗證控件的事件處理程序:protectedvoidOrFieldValidator_ServerValidate(objectsource,ServerValidateEventArgsargs){if(txtUser.Text.Length<=0&&txtEmail.Text.Length<=0)args.IsValid=false;elseargs.IsValid=true;}第33頁,課件共41頁,創(chuàng)作于2023年2月自定義客戶端驗證可通過設(shè)置控件的ClientValidationFunction屬性使驗證在客戶端進(jìn)行。例如<asp:CustomValidatorID="OrFieldValidator"runat="server"Text="Entereitherausernameoraemail"

ClientValidationFunction="validateOrFields"OnServerValidate="OrFieldValidator_ServerValidate"/>此處既有服務(wù)器端驗證,也增加了客戶端驗證。客戶端驗證不需要回傳,效率更高。第34頁,課件共41頁,創(chuàng)作于2023年2月使用客戶端驗證需要定義客戶端驗證函數(shù),并保證函數(shù)的簽名如下:

functionname(source,args)例如<scripttype="text/javascript">functionvalidateOrFields(source,args){varsUser=document.form1.<%=txtUser.ClientID%>.value;varsEmail=document.form1.<%=txtEmail.ClientID%>.value;

if(sUser==""&&sEmail==""){args.IsValid=false;

溫馨提示

  • 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論