ASP.NET MVC Framework支持四種不同類型的Filter:
- Authorization filters – 實現
IAuthorizationFilter接口的屬性
. - Action filters – 實現
IActionFilter接口的屬性
. - Result filters – 實現
IResultFilter接口的屬性
. - Exception filters – 實現
IExceptionFilter接口的
屬性.
Filter的默認的執行順序按上面的列表中順序進行。如驗證(authorization)Filter永遠都是最開始執行的,異常(exception)Filter永遠都是最后執行的,當然你也可以根據需要通過Order屬性設定過濾器執行的順序。
ASP.NET MVC Framework包括幾種Action Filter:
名稱 | 說明 |
OutputCacheAttribute | 類似於 Web Form中在 OutputCache 指令。 OutputCache 屬性允許在 MVC Framework 緩存控制器的輸出。 |
ValidateInputAttribute | 類似於 Web Form中 ValidateRequest 屬性。 MVC 框架默認將為 檢查HTML 或其他危險輸入傳入的 HTTP 請求。 如果檢測到,將引發異常。 使用此屬性可以禁用請求驗證。 |
AuthorizeAttribute | Authorize 屬性,可以對控制器操做的聲明性的授權檢查。 該屬性可以限制特定角色中的用戶的操作。 當您創建只應該給管理員角色中的用戶的操作時,您可以使用此屬性。默認使用的ASP.NET Membership服務,如果不使用ASP.NET 的Membership服務,可以繼承AuthorizeAttribute,重寫實現。 |
ValidateAntiForgeryTokenAttribute | 此屬性是一個解決方案以幫助防止跨站點的請求攻擊 (CSRF)。 它允許驗證的 HTTP POST 為特定於用戶的標記在 Framework。 有關詳細信息 CSRFs,請參閱" 使用 ASP.NET MVC AntiForgeryToken() 幫助器防止跨站點請求偽造 (CSFR)." |
驗證(authorization)filter用於實現在controller action上的驗證和授權,如Authorize filter就是一個驗證filter的例子;
Action filter包含一些邏輯,用於該action執行之前或者之后。比如可以使用一個action filter來修改action返回的view data;
Result filter包含一些邏輯,用於該action的view result執行之前和之后。比如可以修改一個view result在view被呈現到瀏覽器之前;
異常(Exception)Action用於處理異常信息,同樣可以使用異常filter記錄錯誤日志。
這些的filter類型是根據指定的順序執行的,如果需要控制他們的執行順序,需要設置filter的Order屬性。
這些類的基類為System.Web.Mvc.FilterAttribute類,如果需要實現一個特定的filter類型,可以創建一個繼承這個類的類,並且實現一個或多個IAuthorization、IActionFilter、IResultFilter、ExceptionFilter接口。
Action過濾器的作用范圍
除了用Action過濾器標記一個Action方法外,你也可以用來標記一個完成的控制器類。如果這樣的話,這個Action過濾器將會應用到該控制器的所有Action方法上。
另外,如果你的控制器類繼承自別的控制器類,而基控制器類可能有它自己的Action過濾器Attributes。如果你在子類中重寫了基控制器類的Action方法,則子類的該Action方法也會有它自己的從基類繼承而來的Action過濾器Attributes。
Action過濾器的執行順序
每一個Action過濾器都有一個 Order 屬性,用來決定Action過濾器在該范圍內的執行順序。Order屬性必需是0(默認值)或者更大的整數值。省略Order屬性則會給該過濾器的Order值為 -1, 表明為指明順序。任何一個在同一范圍的Action過濾器Order設為 -1 的都將按不確定的順序執行,單在此之前過濾器有一個特定的順序(注:下面會說到).
當設置Order屬性的值的時候,必需指定一個唯一的值。如果兩個或者更多的Action過濾器具有相同的Order屬性值,將會拋出一個異常。
來看一個示例:
[Filter2(Order = 3)]
[Filter3(Order = 1)]
public void Index()
{
RenderView("Index");
}
Filter的執行順序為:Filter3 => Filter1 => Filter2.
內置過濾器簡介
1OutputCacheAttribute
[OutputCache(Duration=10,VaryByParam="none")]
public ActionResult TestCache() {
ViewBag.Time = DateTime.Now.ToString();
return View();
}
上述代碼在動作方法上設置了OutputCache特性,使得頁面具有緩存功能,緩存10秒。Cache的屬性也可在web.config中設置
<caching>
<outputCacheSettings>
<outputCacheProfiles>
<add name="outPutCache" duration="10" varyByParam="none"/>
</outputCacheProfiles>
</outputCacheSettings>
</caching>
相應的動作方法上
[OutputCache(CacheProfile="outPutCache")]
public ActionResult TestCache() {
ViewBag.Time = DateTime.Now.ToString();
return View();
}
2 AuthorizeAttribute
該類主要實現頁面的成員和角色管理,AuthorizeAttribute類中設置了兩個屬性,分別是Users和Roles,分別表示成員和角色
[Authorize]
public ActionResult TestAuthorize()
{
return View();
}
上述動作方法上設置了Authorize特性,指明該動作方法只能是注冊並通過認證的用戶才能訪問
[Authorize(Users="test1,test2")]
public ActionResult TestAuthorize()
{
return View();
}
上述動作方法指明只有用戶test1,test2能夠訪問,如果用戶過多,可以將這些用戶設置為一類角色,通過設置角色參數來設定
[Authorize(Roles="Admin")]
public ActionResult TestAuthorize()
{
return View();
}
上述動作方法指明只有角色為Admin的用戶才能訪問。
3 HandleErrorAttribute
該類實現網站中指定控制器或者控制器中相關方法的異常處理。在動作方法上設置了[HandleError]特性后,發生異常時將自動交給異常處理頁面,在MVC 4中,創建項目時,已經在Global.asax中添加了全局的HandleError特性
public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
filters.Add(new HandleErrorAttribute());
}
ActionFilterAttribute基類
為了讓用戶更簡單的創建一個自定義action filter,ASP.NET MVC Framework提供了一個基類ActionFilterAttribute,這個類實現了IActionFilter和IResultFilter接口,並且繼承了Filter類。
這里的術語並不完全一致,從技術上說,這個類繼承ActionFitlerAttribute,並且同時實現了action filter和result filter接口,但是從寬松意義上說,在ASP.NET MVC Framework中,任何實現filter的類型都是action filter。
ActionFilterAttribute類有以下的方法可以重寫:
- OnActionExecuting – 在controller action執行之前調用
- OnActionExecuted – 在controller action執行之后調用
- OnResultExecuting – 在controller action result執行之前調用
- OnResultExecuted – 在controller action result執行之后調用
以下是這幾個方法的執行順序:
OnActionExecuting()-> Action execute & return View() ->OnActionExecuted() ->OnResultExecuting() -> Render View() ->OnResultExecuted()
為了闡述如何創建一個自定義的action filter,我們會創建一個自定義的action filter,用於記錄controller action處理的不同階段的日志信息,並顯示到Visual Studio輸出窗口中。
public class LoginActionFilter : ActionFilterAttribute
{
public override void OnActionExecuted(ActionExecutedContext filterContext)
{
Log("OnActionExecuted",filterContext.RouteData);
base.OnActionExecuted(filterContext);
}
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
Log("OnActionExecuting", filterContext.RouteData);
base.OnActionExecuting(filterContext);
}
public override void OnResultExecuted(ResultExecutedContext filterContext)
{
Log("OnResultExecuted", filterContext.RouteData);
base.OnResultExecuted(filterContext);
}
public override void OnResultExecuting(ResultExecutingContext filterContext)
{
Log("OnResultExecuting", filterContext.RouteData);
base.OnResultExecuting(filterContext);
}
private void Log(string methodName, RouteData routeData) {
var controllerName = routeData.Values["controller"];
var actionName = routeData.Values["action"];
var message = String.Format("{0} controller: {1} action: {2}", methodName, controllerName, actionName);
Debug.WriteLine(message,"Action Filter Log");
}
}
輸出結果:
Action Filter Log: OnActionExecuting controller: Home action: Index
Action Filter Log: OnActionExecuted controller: Home action: Index
Action Filter Log: OnResultExecuting controller: Home action: Index
Action Filter Log: OnResultExecuted controller: Home action: Index
Filter應用實例:
ASP.NET MVC 入門10、Action Filter 與 內置的Filter實現(實例-防盜鏈)
ASP.NET MVC Action Filter - 緩存與壓縮