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接口。ui

2.Authorization Filters【受權過濾器】spa

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

3.Action Filters【Action過濾器】日誌

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

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基礎系列,暫時先告一段落,我打算寫一些高級的內容,後續若是有基礎的知識須要講,就接着這個系列寫。謝謝你們支持。

相關文章
相關標籤/搜索