ASP.NET Filers用來在MVC框架的不同請求處理階段,註入額外的邏輯。過濾器為橫切關註點提供了一種方法(日誌記錄,授權,緩存)。 在這篇文章中,我將會向你介紹MVC框架支持的各種不同種類過濾器,怎樣控制過濾器的執行,怎樣創建和使用過濾器。我們可以創建自定義的過濾器。在每一個請求中,控制器中 ...
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的試試:
好了 ,以上就是Filters的全部內容,有不明白的,歡迎留言。目前這個0基礎系列,暫時先告一段落,我打算寫一些高級的內容,後續如果有基礎的知識需要講,就接著這個系列寫。謝謝大家支持。