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頁面,可以這樣做:這裡,我只讓[email protected]這個使用者訪問About頁面。
現在我們執行專案,重新註冊一個賬號[email protected].
可以看到,[email protected]這個賬號訪問不了About頁面。又彈出來了登入頁面。
3.再來看看Action Filter,又下面的幾個Action Filters:
- Output Cache:快取控制器的Action
- Handle Error:當控制器的方法報錯的時候,處理錯誤
- Authorize :允許你限制有相應許可權的才能訪問
Output Cache
下面的例子,指定返回值將會被快取5秒
再看看Handle Error例子:
為了實現Handle例子,我們改裝一下AuthAttribute類:
注意我們需要建立一個靜態的錯誤頁面:
然後執行專案,在位址列輸入 :
然後就看到了:錯誤頁面》》
輸入大於100的試試: