mvc4中的過濾器
過濾器(Filter)把附加邏輯注入到MVC框架的請求處理。實現了交叉關注。
交叉關注:用于整個應用程序,又不適合放在某個局部位置的功能。
過濾器是.NET的注解屬性(Attribute),它們對請求處理管道添加了額外的步驟。
注解屬性是派生于System.Attribute的特殊的.NET類。
可以被附加到類、方法、屬性、字段等代碼元素上。其目的是把附加信息嵌入到已編譯的代碼中,以便在運行時讀回這些信息。
過濾器的基本類型:
過濾器類型 | 接口 | 默認實現 | 描述 |
Authorization | IAuthorizationFilter | AuthorizationAttribute | 最先運行 |
Action | IActionFilter | ActionFilterAttribute | 在動作方法前后運行 |
Result | IResultFilter | ActionResultAttribute | 在動作結果被執行前后 |
Exception | IExceptionFilter | HandlerErrorAttribute | 僅在過濾器、動作發生異常時 |
授權過濾器:IAuthorizationFilter
namespace System.Web.Mvc{ // 摘要:定義授權篩選器所需的方法。 public interface IAuthorizationFilter{ // 摘要:在需要授權時調用。 // 參數:filterContext:篩選器上下文。 void OnAuthorization(AuthorizationContext filterContext); }}
注意:
直接實現接口其實是一件非常危險的事;因此創建一個自定義AuthorizeAttribute子類,再實現授權代碼比較容易。
public class CustomAuthAttribute:AuthorizeAttribute{ /// <summary> /// 是否對請求進行授權訪問的方式 /// </summary> /// <param name="httpContext">對請求信息進行訪問的方法</param> protected override bool AuthorizeCore(HttpContextBase httpContext){ return base.AuthorizeCore(httpContext); }}
直接實現IAuthorizationFilter接口的主要原因是為了獲取對傳遞給OnAuthorization()的AuthorizationContext的訪問,通過它可以獲得更廣泛的信息(路由細節、當前控制器和動作方法信息)。使用接口的方式不僅有安全風險且讓授權注解屬性中建立的邏輯與控制器緊密的耦合在一起,破壞關注分離,不便于維護。
內建的授權過濾器:
雖然使用了AuthorizeAttribute類作為自定義過濾器的基礎,但其AuthorizeCore()有自己的實現
當直接使用AuthorizeAttribute時,可以使用它的public屬性來指定授權策略
AuthorizeAttribute屬性
名稱 | 類型 | 描述 |
Users | String | 一個逗號分隔的用戶名列表,指定這些用戶可以訪問動作方法 |
Roles | String | 一個逗號分隔的角色列表,用戶必須至少有一個角色 |
public class HomeController : Controller{ [Authorize(Users ="admin,steve,jacqui",Roles ="admin")] public ActionResult Index(){ return View(); }}
異常過濾器:
namespace System.Web.Mvc{ // 摘要:定義異常篩選器所需的方法。 public interface IExceptionFilter{ // 摘要:在發生異常時調用。 // 參數:filterContext: // 篩選器上下文。 void OnException(ExceptionContext filterContext); }}
當一個未處理的異常出現時,OnException()被調用。該方法的參數是一個ExceptionContext 對象,此對象派生于ControllerContext,并提供了許多有用的屬性。
名稱 | 類型 | 描述 |
Controller | ControllerBase | 返回請求的控制器對象 |
HttpContext | HttpContextBase | 提供對請求細節的訪問及對響應的訪問 |
IsChildAction | Bool | 若是自動做則返回true |
RequestContext | RequestContext | 提供對HttpContext和路由數據的訪問 |
RouteData | RouteData | 返回請求的路由數據 |
繼承自ControllerContext的屬性
名稱 | 類型 | 描述 |
ActionDescripter | ActionDescripter | 提供動作方法的細節 |
Result | ActionResult | 用于動作方法的結果,通過非空值可取消請求 |
Exception | Exception | 未處理的異常 |
ExceptionHandled | Bool | 如果另一個過濾器已經把這個異常標記為已處理則返回true |
實現自定義異常過濾器
public class RangeExceptionAttribute : FilterAttribute, IExceptionFilter{ public void OnException(ExceptionContext filterContext){}}
使用內建的異常過濾器:
HandleErrorAttribute屬性
名稱 | 類型 | 描述 |
ExceptionType | Type | 由過濾器處理的異常類型 |
View | String | 該過濾器渲染的視圖模板名 |
Master | String | 在渲染這個過濾器的視圖時使用的布局名稱 |
準備工作:
在web.config文件中啟用自定義錯誤時,HandleErrorAttribute過濾器才會生效,在<system.web>節點中添加一個customErrors屬性即可;
<system.web> <!--定制錯誤頁aa.html--> <customErrors mode="On" defaultRedirect="/Content/aa.html" /> </system.web>
Mode屬性的默認值是RemoteOnly在開發期間,HandleErrorAttribute將不會攔截異常,但當應用程序部署到產品服務器時,并從另一臺計算機發出請求時HandleErrorAttribute變生效
[HandleError(ExceptionType =typeof(ArgumentNullException),View ="Null")] public ActionResult Index(){ return View(); }
在渲染視圖時HandleErrorAttribute過濾器會傳遞一個HandleErrorInfo視圖模型對象這是一個封裝了異常細節的封裝程序
名稱 | 類型 | 描述 |
ActionName | String | 返回生成異常的Action名稱 |
ControllerName | String | 返回生成異常的Controller名稱 |
Exception | Exception | 返回此異常 |
@model HandleErrorInfo@{ ViewBag.Title = "Sorry";}<!DOCTYPE html><html><head> <meta name="viewport" content="width=device-width" /></head><body>@Model.Exception.StackTrace</body></html>
備注:使用HandleError過濾器時一定要包含Model.Exception.StackTrace否則視圖不會顯示給用戶,引用沒必要給用戶展示堆棧信息所以可以將該值放入div并隱藏
動作過濾器
用于任何目的的多用途過濾器
namespace System.Web.Mvc{ // 摘要:定義操作篩選器中使用的方法。 public interface IActionFilter{ // 摘要:在執行操作方法后調用。 // 參數:filterContext: // 篩選器上下文。 void OnActionExecuted(ActionExecutedContext filterContext); // 摘要:在執行操作方法之前調用。 // 參數:filterContext: // 篩選器上下文。 void OnActionExecuting(ActionExecutingContext filterContext); }}
ActionExecutingContext 屬性
名稱 | 類型 | 描述 |
ActionDescriptor | ActionDescriptor | 動作方法的描述 |
Result | ActionResult | 動作方法的結果,設置屬性非空值,過濾器可以取消請求 |
ActionExecutedContext 屬性
名稱 | 類型 | 描述 |
ActionDescriptor | ActionDescriptor | 動作方法的描述 |
Canceled | Bool | 如果該動作被另一個過濾器取消,則返回true |
Exception | Exception | 返回由另一個過濾器或動作方法拋出的異常 |
ExceptionHandled | Bool | 如果異常被處理返回true |
Result | ActionResult |
|
結果過濾器:
它會對動作方法所產生的結果進行操作
namespace System.Web.Mvc{ // 摘要:定義結果篩選器所需的方法。 public interface IResultFilter{ // 摘要:在操作結果執行后調用。 // 參數:filterContext: // 篩選器上下文。 void OnResultExecuted(ResultExecutedContext filterContext); // 摘要:在操作結果執行之前調用。 // 參數:filterContext: // 篩選器上下文。 void OnResultExecuting(ResultExecutingContext filterContext); }}
動作方法如何返回動作結果,讓用戶能夠將動作方法的意圖與動作方法的執行分離。將結果過濾器運用于一個動作方法時會在動作方法返回結果時、但在執行該動作結果之前調用OnResultExecuting。動作結果執行之后調用OnResultExecuted
內建的動作過濾器和結果過濾器
Mvc框架包含一個內建的類,可以用來創建動作過濾器和結果過濾器,這個類的名稱ActionFilterAttribute
namespace System.Web.Mvc{ // 摘要:表示篩選器特性的基類。 public abstract class ActionFilterAttribute : FilterAttribute, IActionFilter, IResultFilter{ // 摘要:在執行操作方法后由 ASP.NET MVC 框架調用。 // 參數:filterContext: // 篩選器上下文。 public virtual void OnActionExecuted(ActionExecutedContext filterContext); // 摘要:在執行操作方法之前由 ASP.NET MVC 框架調用。 // 參數:filterContext: // 篩選器上下文。 public virtual void OnActionExecuting(ActionExecutingContext filterContext); // 摘要:在執行操作結果后由 ASP.NET MVC 框架調用。 // 參數:filterContext: // 篩選器上下文。 public virtual void OnResultExecuted(ResultExecutedContext filterContext); // 摘要:在執行操作結果之前由 ASP.NET MVC 框架調用。 // 參數:filterContext: // 篩選器上下文。 public virtual void OnResultExecuting(ResultExecutingContext filterContext); }}
使用這個類的唯一好處是不需要重寫和實現不打算使用的方法。除此之外,直接實現過濾器接口沒有任何好處
自定義實例:
public class ProfileAllAttribute: ActionFilterAttribute{ private Stopwatch timer; public override void OnActionExecuting(ActionExecutingContext filterContext){ timer = Stopwatch.StartNew(); } public override void OnActionExecuted(ActionExecutedContext filterContext){ timer.Stop(); filterContext.HttpContext.Response.Write( string.Format("<div>Total elapsed time:{0}</div>", timer.Elapsed.TotalSeconds)); }}public class HomeController : Controller{ [ProfileAll] public ActionResult Index(){ return View();}}
其它過濾器屬性:
public abstract class Controller : ControllerBase, IActionFilter, IAuthenticationFilter, IAuthorizationFilter, IDisposable, IExceptionFilter, IResultFilter, IAsyncController, IController, IAsyncManagerContainer
過濾器的幾種實現形式:
①全局過濾器
在FilterConfig中直接注冊實現類
②實現接口
③注解
對過濾器執行排序
過濾器是按類型執行的其順序:授權-》Action-》result。如果有未處理異常,框架在任一階段都會執行異常過濾器
namespace System.Web.Mvc{ // 摘要:表示操作和結果篩選器特性的基類。 public abstract class FilterAttribute : Attribute, IMvcFilter{ // 摘要: 獲取或設置一個值,該值指示是否可指定篩選器特性的多個實例。 // 返回結果:如果可指定篩選器特性的多個實例,則為 true;否則為 false。 public bool AllowMultiple { get; } // 摘要: 獲取或者設置執行操作篩選器的順序。 // 返回結果:執行操作篩選器的順序。 public int Order { get; set; } } }
內建過濾器
過濾器 | 描述 |
RequireHttps | 強迫Action使用Https協議 |
OutputCache | 緩存一個Action的 |
ValidateInputand ValidationAntiForgeryToken | 與安全性有關的授權過濾器 |
AsyncTimeout NoAsyncTimeout | 用戶異步控制器 |
ChildActionOnlyAttribute | 一個支持Html.action和Html.RenderAction輔助器方法的過濾器 |
RequireHttps
RequireHttps過濾器讓Action強制使用HTTPS協議。他將用戶瀏覽器重定向到同一個動作,但使用‘https://'協議前綴
在形成不安全請求時,重寫HandledNonHttpsRequest(),以創建自定義行為,該過濾器僅用于GET請求,POST則會丟掉數據;該過濾器時授權過濾器
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持VeVb武林網。
新聞熱點
疑難解答
圖片精選