8. Filters in ASP.NET MVC 5.0【ASP.NET MVC 5.0中的過濾器】


         ASP.NET Filers用來在MVC框架的不同請求處理階段,注入額外的邏輯。過濾器為橫切關注點提供了一種方法(日志記錄,授權,緩存)。

       在這篇文章中,我將會向你介紹MVC框架支持的各種不同種類過濾器,怎樣控制過濾器的執行,怎樣創建和使用過濾器。我們可以創建自定義的過濾器。在每一個請求中,控制器中的方法會檢查,是否用戶是正確授權的,如果是正確授權的用戶,就會允許用戶執行相應的方法,顯示相應的視圖給用戶。

       ASP.NET支持四種類型的過濾器。Authentication過濾器是在ASP.NET MVC 5中介紹的。每種過濾器都允許你在請求的不同階段,注入相應邏輯處理。

Filters Type【過濾器類型】 Interface【接口】  
Authentication【驗證過濾器】 IAuthenticationFilter 在所有其他的過濾器或者Action方法之前執行
Authorization【授權過濾器】 IAuthorizationFilter 在允許其他過濾器或者Action方法之前,執行
Action【Action過濾器】 IActionFilter 在Action方法之前或者之后執行
Result【結果過濾器】 IResultFilter 在Action方法的執行結果之前或者之后執行
Exception【異常過濾器】 IExceptionFilter 只有在其他過濾器,Action方法,或者Action的執行結果執行的時候出現異常,才會執行異常過濾器

ASP.NET 中的過濾器類型以及它們的執行順序

1.Authentication Filters【驗證過濾器】

Authentication 過濾器在任何其他過濾器或者Action方法之前執行。Authentication 過濾器確保你是合法還是非法用戶。它實現了IAuthenticationFilter接口。

2.Authorization Filters【授權過濾器】

AuthorizeAttribute和RequireHttpsAttribute都是Authorizatio過濾器的例子。授權過濾器用來檢查用戶是否有訪問權限。授權過濾器實現了IAuthorizationFilter接口。

3.Action Filters【Action過濾器】

Action過濾器是一個特性,你可以應用到控制器的方法上,也可以應用到整個控制器上。這個過濾器將會在Action方法開始執行之前或者開始執行之后執行,以及Action執行之后開始調用。

Action過濾器實現了IActionFilter接口,有兩個方法OnActionExecuting和OnActionExecuted。OnActionExecuting在Action方法之前執行,並給了一個機會來取消執行Action方法。這些過濾器包含了一些邏輯,在Action方法執行之前或者執行之后調用,你可以使用Action過濾器,來修改控制器中的Action方法返回的視圖數據。

4.Result Filters【結果過濾器】

OutputCacheAttribute類就是結果過濾器的一個例子。結果過濾器實現了IResultFilter接口。和IActionFilter類似,也有OnResultExecuting和OnResultExecuted兩個方法。這些過濾器包含一些邏輯,在ViewResult開始執行之前或者之后調用。你可以使用結果過濾器,來修改視圖的結果,在視圖呈現到瀏覽器之前。

5.Exception Filters【異常過濾器】

HandleErrorAttribute類是ExceptionFilters的一個例子。異常過濾器實現了IExceptionFilter接口,異常過濾器在程序運行的過程中如果發生了未處理的異常就會執行。這些過濾器可以用做異常過濾器,用來處理控制器中的Action方法的錯誤,或者Action方法返回結果的錯誤。你可根據需要以重寫這些方法。

 

好了,上面的理論知識介紹的差不多,我們來創建一個項目,練練手,實際操作一下:

1.在ASP.NET MVC 5中創建一個自定義的Authentication過濾器

創建一個MV項目:

在項目中,創建一個文件夾AuthData,添加我們自定義的類AuthAttribute;

 

 IAuthenticationFilter接口定義了兩個方法:OnAuthentication和OnAuthenticationChallenge。OnAuthentication先執行,用來處理需要的驗證邏輯。OnAuthenticationChallenge用來根據用戶驗證的結果,進一步做限制處理。在OnAuthentication方法中,我寫了一些代碼用來對用戶作驗證,OnAuthenticationChallenge中,我寫了一些代碼,用來執行其他任務。

 現在,讓我們來測試一下,我們寫的自定義驗證過濾器;

 

 運行項目,然后注冊:

 

 

 

 

 

 你還可以管理你的賬戶信息:

 

 2.現在看看 Authorization Filter:

Authorization確保只有經過允許的用戶才能訪問。這些過濾器在Action方法執行之前調用,實現了IAuthorizationFilter接口。包含了一個方法OnAuthorization。

為了驗證Authorization,我們對剛才的AuthAttribute類作個修改。我們重寫了AuthorizeAttribute類中的AuthorizeCore(HttpContextBase httpContext)方法。

現在打開Home控制器,修改代碼:

 

運行項目:輸入剛才注冊的賬號和密碼:可以看到授權通過,登錄成功了。

 還可以這樣:在About方法上標識特性,然后允許項目,點擊關於按鈕,就會彈出來登錄頁面,讓登錄:

還可以限制,只讓某個用戶看到About頁面,可以這樣做:這里,我只讓649713412@qq.com這個用戶訪問About頁面。

 

 現在我們運行項目,重新注冊一個賬號123456@qq.com.

可以看到,123456@qq.com這個賬號訪問不了About頁面。又彈出來了登錄頁面。

 

 3.再來看看Action Filter,又下面的幾個Action Filters:

  1. Output Cache:緩存控制器的Action
  2. Handle Error:當控制器的方法報錯的時候,處理錯誤
  3. Authorize :允許你限制有相應權限的才能訪問

Output Cache

下面的例子,指定返回值將會被緩存5秒

 

 

 

再看看Handle Error例子:

為了實現Handle例子,我們改裝一下AuthAttribute類:

注意我們需要創建一個靜態的錯誤頁面:

 

 然后運行項目,在地址欄輸入

 

 然后就看到了:錯誤頁面》》

 

 輸入大於100的試試:

 

 

 

 

 好了 ,以上就是Filters的全部內容,有不明白的,歡迎留言。目前這個0基礎系列,暫時先告一段落,我打算寫一些高級的內容,后續如果有基礎的知識需要講,就接着這個系列寫。謝謝大家支持。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM