




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、MVC過濾器詳解APS.NET MVC中(以下簡稱 “ MVC”的每一個(gè)請(qǐng)求,都會(huì)分配給相應(yīng)的控制器和對(duì)應(yīng)的 行為方法去處理,而在這些處理的前前后后如果想再加一些額外的邏輯處理。這時(shí)候就用到了過濾器。MVC支持的過濾器類型有四種,分別是:Authorization(授權(quán)),Action(行為),Result (結(jié)果)和 Exception (異常)。如下表,過濾器類型接口描述Authorizati onIAuthorizati onF ilter此類型(或過濾器)用于限制進(jìn)入控制器 或控制器的某個(gè)行為方法Excepti onIExcepti onF ilter用于指定一個(gè)行為,這個(gè)被指定的行為
2、處 理某個(gè)行為方法或某個(gè)控制器里面拋出的 異常Actio nIActio nFilter用于進(jìn)入行為之前或之后的處理ResultIResultFilter用于返回結(jié)果的之前或之后的處理但是默認(rèn)實(shí)現(xiàn)它們的過濾器只有三種,分別是Authorize(授權(quán))an dleError(錯(cuò)誤處理);各種信息如下表所示,ActionFilter, H過濾器類名實(shí)現(xiàn)接口描述Acti onF ilterAuthorizeAttributeIAuthorizati onF ilter此類型(或過濾器)用 于限制進(jìn)入控制器或 控制器的某個(gè)行為方 法Han dleErrorHan dleErrorAttribute I
3、Excepti onF ilter用于指定一個(gè)行為,這 個(gè)被指定的行為處理 某個(gè)行為方法或某個(gè) 控制器里面拋出的異 常自定義Actio nFilterAttributeIActio nFilter和IResultFilter用于進(jìn)入行為之前或 之后的處理或返回結(jié) 果的之前或之后的處理F面介紹的過濾器中,除了上面這幾種外,還多加一種過濾器OutputCache1授權(quán)過濾器Authorize1.1默認(rèn)Authorize 使用現(xiàn)在在網(wǎng)上無論是要求身份驗(yàn)證的地方多得是,發(fā)郵件,買東西,有時(shí)候就算吐個(gè)槽都要提示登錄的。這里的某些操作,就是要經(jīng)過驗(yàn)證授權(quán)才被允許。在MVC中可以利用Authorize來實(shí)現(xiàn)
4、。例如一個(gè)簡單的修改密碼操作Authorizepublic Action Result ChangePassword()return View();它需要用戶通過了授權(quán)才能進(jìn)入到這個(gè)行為方法里面,否則硬去請(qǐng)求那個(gè)頁面的話,只會(huì)得到這個(gè)結(jié)果中苗賦易器錯(cuò)I碣嘰酣 URL:如果要通過驗(yàn)證,通過調(diào)用FormsAuthe nticatio n.SetAuthCookie方法來獲得授權(quán),登陸的頁面如下model FilterTest.Models. LogI nModelLayout = n ull; Log in v/titlev/headus ing( Html.Beg in Form() ID:Ht
5、ml.TextBoxFor(m=m.UserName) Password:Html.PasswordFor(m= m.Password)行為方法如下BHttpPost/這里用了謂詞過濾器,只處理 POST的請(qǐng)求public Action Result Log in( Log InM odel logi n)if (login.UserName = admin & login.Password = 123456) FormsAuthe nticatio n.SetAuthCookie(logi n.UserName, false); return Redirect(/Customer/Chang
6、ePassword):return View();魚當(dāng)然有登錄也要有注銷,因?yàn)樽N是在登陸之后發(fā)生的,沒登陸成功也就沒有注銷,所以注銷的行為方法也要加上 Authorize 過濾器,注銷調(diào)用的是FormsAuthentication.SignOu t方法,代碼如下Authorizepublic Action Result LogOut()FormsAuthe nticatio n.Sig nOut(); return Redirect(/Customer/Login);1.2自定義授權(quán)我們不一定要用 MVC默認(rèn)的Authorize授權(quán)驗(yàn)證規(guī)則,規(guī)則可以自己來定,自定義授權(quán)過濾器可以繼承Auth
7、orizeAttribute這個(gè)類,這個(gè)類里面有兩個(gè)方法是要重寫的bool AuthorizeCore(HttpC on textBasehttpC on text):這里主要是授權(quán)驗(yàn)證的邏輯處理,返回true的則是通過授權(quán),返回了 false則不是。voidHan dle Un authorizedRequest(Authorizati onCon textfilterCon text):這個(gè)方法是處理授權(quán)失敗的事情。這里就定義了一個(gè)比較騎呢的授權(quán)處理器,當(dāng)請(qǐng)求的時(shí)候剛好是偶數(shù)分鐘的,就通過可以獲得授權(quán),反之則不通過。當(dāng)授權(quán)失敗的時(shí)候,就會(huì)跳轉(zhuǎn)到登陸頁面了。public class MyAu
8、thorizeAttribute:AuthorizeAttribute protected override bool AuthorizeCore(HttpC on textBase httpC on text) /return base.AuthorizeCore(httpC on text);return DateTime.Now.Minute % 2 = 0protected override void HandleUnauthorizedRequest(AuthorizationConte xt filterContext)filterC on text.HttpC on text.R
9、esp on se.Redirect/Customer/Logi n);/base.Ha ndleU nauthorizedRequest(filterC on text);然后用到一個(gè)行為方法上,MyAuthorizepublic ActionResult ShowDetail() return View();每當(dāng)偶數(shù)分鐘的時(shí)候就可以訪問得到這個(gè)ShowDetail的視圖,否則就會(huì)跳到了登陸頁面了。2處理錯(cuò)誤過濾器Han dleError2.1默認(rèn) HandleError使用在往常的開發(fā)中,想到異常處理的馬上就會(huì)想到try/catch/finally 語句塊。在 MVC里面,萬一在行為方法里
10、面拋出了什么異常的,而那個(gè)行為方法或者控制器有用上Han dleError過濾器的,異常的信息都會(huì)在某一個(gè)視圖顯示出來,這個(gè)顯示異常信息的視圖默認(rèn)是在Views/Shared/Error這個(gè)HandleError的屬性如下屬性名稱類型描述Excepti on TypeType要處理的異常的類型,相當(dāng)于Try/Catch語句塊里Catch捕捉的類型,如果這里不填的話則 表明處理所有異常ViewStri ng指定需要展示異常信息的視圖, 只需要視圖名稱就可以了,這個(gè)視圖文件要放在Views/Shared文件夾里面MasterStri ng指定要使用的母版視圖的名稱OrderInt指定過濾器被應(yīng)用的
11、順序,默認(rèn)是-1,而且優(yōu)先級(jí)最高的是 -1這個(gè)Order屬性其實(shí)不只這個(gè) HandleError過濾器有,其優(yōu)先級(jí)規(guī)則跟其他過濾器的都是一樣。下面則故意弄一個(gè)會(huì)拋異常的行為方法Ha ndleError(Exceptio nType = typeof(Exceptio n)public Action Result ThrowErrorLogin()throw new Excepti on (this is ThrowErrorLogi n Actio n Throw);節(jié)中添加以下代碼光是這樣還不夠,還要到 web.config 文件中的vcustomErrors mode=On /要等到部署到
12、服務(wù)器上面才會(huì)開啟,讓異常信息比較友因?yàn)槟J(rèn)的開發(fā)模式中它是關(guān)閉的, 好的用一個(gè)視圖展現(xiàn)。像這里訪問 ThrowErrorLogin視圖時(shí),由于拋出了一次,就轉(zhuǎn)到了一個(gè)特定的視圖4-C localhost: I KV匸ustOtnef/Throwro oginSorryr an error occurred while processing your request-在這里看到的異常視圖是這樣的,除了用這個(gè)建項(xiàng)目時(shí)默認(rèn)生成的異常視圖之外,我們還可以自己定義異常視圖,視圖里面要用到的異常信息,可以通過Model獲取,它是一個(gè)Exceptionlnfo類型的實(shí)例,例如這里建了一個(gè)異常視圖如下Lay
13、out = n ull;v!DOCTYPE html MyErrorPageThere was a Model.Excepti on .GetType().Name while rendering Model.ControllerNames Model.ActionName action.Model.Exceptio n.Messag$/bStack trace:Model.Exception.StackTracev/divv/bodyv/html它存放的路徑是/Views/Shared里面,像上面的行為方法如果要用異常信息渲染到這個(gè)視圖上面,在控制器的處改成這樣就可以了Han dleErro
14、r(Excepti on Type = typeof(Excepti on). View = MyErrorPage)i 二I 歳口1 鼻 aia毎 社*.聲 貫它曲.*Tb碎e wvi h Rirrf-iiMi mil;* teiNt;口( ChvIckt i TlnatrT4n*tin litakfhiji Ij., ThrvuKf*!91*11 bn Ik甲 i *wi TMwSldl IFKV;2.2自定義錯(cuò)誤異常處理這里的錯(cuò)誤處理過濾器也可以自己來定義,寫 void OnException(ExceptionContext理未處理的異常,例如做法是繼承HandleErrorAttri
15、bute類,重filterCo ntext)方法,這個(gè)方法調(diào)用是為了處Actio npublic override void On Excepti on( Excepti onCon text filterC on text)/base. On Exceptio n(filterC on text);if (!filterContext.ExceptionHandled &filterContext.Exception.Message = this is ThrowErrorLogin Throw)filterC on text.Exceptio nHan dled=true;filterCo
16、ntext.HttpContext.Response.Write(5 洗 ten No Problem +filterC on text.Exceptio n.ToStri ng();屬性名稱類型描述Action DescriptorAction Descriptor提供詳細(xì)的操作方法ResultActio nResult結(jié)果的操作方法,過濾器可以取消,要求將此屬性設(shè)置為一個(gè)非空Excepti onExcepti on未處理的異常Excepti onHan dledbool另一個(gè)過濾器,則返回true,如果有明顯的異常處理又可以獲取異常的信息,它部分屬性如下這里的ExceptionHandle
17、r屬性要提一下的是,如果這個(gè)異常處理完的話,就把它設(shè)為true,那么即使有其他的錯(cuò)誤處理器捕獲到這個(gè)異常,也可以通過ExceptionHandler屬性判斷這個(gè)異常是否經(jīng)過了處理,以免重復(fù)處理一個(gè)異常錯(cuò)誤而引發(fā)新的問題。3OutputCache 過濾器OutputCache過濾器用作緩存,節(jié)省用戶訪問應(yīng)用程序的時(shí)間和資源,以提高用戶體驗(yàn),可這個(gè)我試驗(yàn)試不出它的效果。留作筆記記錄一下。OutputCacheAttribute 這個(gè)類有以下屬性描述緩存的時(shí)間,以秒為單位,理論上緩存時(shí)間可以很 長,但實(shí)際上當(dāng)系統(tǒng)資源緊張時(shí),緩存空間還是會(huì) 被系統(tǒng)收回。以哪個(gè)字段為標(biāo)識(shí)來緩存數(shù)據(jù),比如當(dāng)“ ID 字段
18、變化時(shí),需要改變緩存(仍可保留原來的緩存),那 么應(yīng)該設(shè)VaryByParam 為ID。這里你可以設(shè)置 以下幾個(gè)值:* = 任何參數(shù)變化時(shí),都改變緩存。none = 不改變緩存。以分號(hào)“;為間隔的字段名列表=列表中的字段發(fā)生變化,則改變緩存。緩存數(shù)據(jù)放在何處。默認(rèn)是Any,其他值分別是Clie nt , Down stream , Server , None , ServerA ndClie nt屬性名稱Durati onVaryByParamLocati on類型intstri ngOutputCacheLocationNoStorebool用于決定是否阻止敏感信息的二級(jí)存儲(chǔ)。例如一個(gè)Out
19、putCache過濾器可以這樣使用OutputCache(Locati on= System.Web.Ul.OutputCacheLocatio n. Clie nt,Dur atio n=60)public Action Result Login()return View();或者有另外一種使用方式使用配置文件,在節(jié)點(diǎn)下添加以下設(shè)置voutputCacheSetti ng使用控制的時(shí)候就這樣OutputCache(CacheProfile=testCache)public Action Result Login()return View();4自定義過濾器萬一前面介紹的過濾器也滿足不了需求,
20、要在行為方法執(zhí)行返回的前前后后定義自己的處理邏輯的話,這個(gè)自定義過濾器就應(yīng)該能派上用場了。若要自定義一個(gè)過濾器,則要繼承ActionFilterAttribute類,這個(gè)類是一個(gè)抽象類,實(shí)現(xiàn)了 lActionFilter 和 IResultFilter接口,主要通過重寫四個(gè)虛方法來達(dá)到在行為方法執(zhí)行和返回的前后注入邏輯方法參數(shù)描述OnAction ExecutingActio nExecuti ngCon text在行為方法執(zhí)行前執(zhí)行On Actio nExecutedActi on ExecutedC on text在行為方法執(zhí)行后執(zhí)行On ResultExecuti ngResultExe
21、cuti ngCon text在行為方法返回前執(zhí)行On ResultExecutedResultExecutedC on text在行為方法返回后執(zhí)行四個(gè)方法執(zhí)行順序是 On Actio nExecuti ngOn Actio nExecuted On ResultExecut ingOn ResultExecuted。上面四個(gè)方法的參數(shù)都是繼承基Con tollorCo ntext類。例如下面定義了一個(gè)自定義的過濾器public class MyCustomerFilterAttribute : Actio nF ilterAttributepublic string Message get
22、; set; public override void On Acti on Executed(Acti on ExecutedC on text filterContext)base On Actio nExecuted(filterC on text);filterContext.HttpContext.Response.Write(string.Format( 0Action finish Execute.”,Message);public override void On Actio nExecuti ng(Actio nExecuti ngCon text filterC on te
23、xt)CheckMessage(filterCo ntext);filterContext.HttpContext.Response.Write(string.Format( 0Action start Execute., Message);base On Actio nExecuti ng(filterC on text);public override void OnResultExecuted(ResultExecutedContextfilterContext)filterContext.HttpContext.Response.Write(string.Format( 0Action
24、 finish Result., Message);base On ResultExecuted(filterC on text);public override void OnResultExecuting(ResultExecutingContext filterCon text)filterContext.HttpContext.Response.Write(string.Format( 0Action start Execute., Message);base On ResultExecuti ng(filterC on text);private void CheckMessage(
25、Acti on Executi ngCon text filterC on text)if(string.lsNullOrEmpty( Message)string.lsNullOrWhiteSpace(Messa ge)Message = filterContext.Controller.GetType().Name + s + filterC on text.Actio nDescriptor.Actio nName;使用它的行為方法定義如下MyCustomerFilterpublic Action Result CustomerFilterTest()Response.Writelnvk
26、ing CustomerFilterTest Action); return View();執(zhí)行結(jié)果如下localhost:1900/Customer/customerfiltertest窘可站從IE 口導(dǎo)入$3 Google廣茶方蜒科技亙限Action start ExecuteAction finish ExecuteAction start ExecuteAction finish ResultiA)此網(wǎng)頁為I憨”網(wǎng)頁是否需要翻譯?翻譯|罔Cusl oinerControl 1 er; s cust ojnerfi 11 ert e stInvking CustomerFi11erTest ActionCus t omerControl1er1 s cust onerfi11 ert es tCustomerControllerJ s customerfiltertestCustorrierControllerJ s custoiBerfi 11ertest這個(gè)就證明了上面說的順序。當(dāng)控制器也使用上這過濾器時(shí),而行為方法不使用時(shí),結(jié)果如下- C 1 localhost: 1900/Customer/customerfiltertest詵刪
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 產(chǎn)品度合同范例
- 單位租憑員工車輛合同范本
- 中糧銷售合同范本
- 化工散水出售合同范本
- seb采購合同范本
- 華為銷售合同范本
- 農(nóng)業(yè)采購合同范本格式
- 伐樹施工合同范本
- 代理業(yè)主房屋合同范本
- 寫作委托協(xié)議合同范本
- 地理-天一大聯(lián)考2025屆高三四省聯(lián)考(陜晉青寧)試題和解析
- 小巴掌童話課件
- 教科版六年級(jí)科學(xué)下冊(cè)全冊(cè)教學(xué)設(shè)計(jì)教案
- 初中數(shù)學(xué)新課程標(biāo)準(zhǔn)(2024年版)
- GB/T 19342-2024手動(dòng)牙刷一般要求和檢測(cè)方法
- 2024年山東鐵投集團(tuán)招聘筆試參考題庫含答案解析
- 8款-組織架構(gòu)圖(可編輯)
- 《鋼鐵是怎樣煉成的》讀書報(bào)告
- 中學(xué)生班干部培訓(xùn)方案(共4頁)
- 凈土資糧——信愿行(11)第六講凈業(yè)三福變化氣質(zhì)
- 美的集團(tuán)公司分權(quán)手冊(cè)
評(píng)論
0/150
提交評(píng)論