MVC基本型別的過濾器
過濾器在mvc中發揮著很重要的作用
過濾器(Filters)的出現使得我們可以在ASP.NET MVC程式裡更好的控制瀏覽器請求過來的URL,不是每個請求都會響應內容,只響應特定內容給那些有特定許可權的使用者,過濾器理論上有以下功能:
判斷登入與否或使用者許可權
決策輸出快取
防盜鏈
防蜘蛛
本地化與國際化設定
實現動態Action(做許可權管理系統的好東西)
過濾器型別 | 介面 | 預設實現繼承類 | 功能描述 |
Action | IActionFilter | ActionFilterAttribute | 在動作方法之前及之後執行 |
Result | IResultFilter | ActionFilterAttribute | 在動作結果被執行之前和之後執行 |
AuthorizationFilter | IAuthorizationFilter | AuthorizeAttribute | 首先執行,在任何其它過濾器動作方法之前執行 |
Exception | IExceptionFilter | HandleErrorAttribute | 只在另外一個過濾器,動作方法,動作結果彈出異常時執行 |
一、Action過濾器
Action過濾器和Result過濾器我在這裡是一起新增
首先說一下Action過濾器;主要負責在動作方法之前及之後執行(動作,方法許可權)
1、ActionAttribute過濾器繼承ActionFilterAttribute類
2、ActionAttribute過濾器呼叫IActionFilter介面
3、重寫OnActionExecuting方法;此方法是在Action動作方法執行前
4、重寫OnActionExecuted方法;此方法是在Action動作方法執行後
Result過濾器;在動作結果被執行之前和之後執行 (結果許可權)
1、ActionAttribute過濾器繼承ActionFilterAttribute類(和Action繼承成的同一個基類)
2、ActionAttribute過濾器呼叫IResultFilter介面
2、重寫OnResultExecuting方法;此方法是在執行操作結果前
3、重寫OnActionExecuted方法;此方法是在執行操作結果前
程式碼如下:
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.Mvc; namespace MVCcation.Filters { //Action在動作方法之前及之後執行 public class ActionAttribute: ActionFilterAttribute, IActionFilter { public override void OnResultExecuting(ResultExecutingContext filterContext) { //base.OnResultExecuting(filterContext); filterContext.HttpContext.Response.Write("在執行操作結果前"); } public override void OnResultExecuted(ResultExecutedContext filterContext) { //base.OnResultExecuted(filterContext); filterContext.HttpContext.Response.Write("在執行操作結果後"); } public override void OnActionExecuting(ActionExecutingContext filterContext) { //base.OnActionExecuting(filterContext); filterContext.HttpContext.Response.Write("在Action方法執行前"); } public override void OnActionExecuted(ActionExecutedContext filterContext) { //base.OnActionExecuted(filterContext); filterContext.HttpContext.Response.Write("在Action方法執行後<br/>"); } } }
接下來就在控制器中過濾器;這裡我選擇index檢視,所以在index控制器上面新增過濾器
using MVCcation.Filters;//引用過濾器檔案目錄 using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.Mvc; namespace MVCcation.Controllers { public class HomeController : Controller { [Action]//(執行動作和操作)動作處理器 public ActionResult Index() { return View(); } public ActionResult About() { ViewBag.Message = "Your application description page."; return View(); } public ActionResult Contact() { ViewBag.Message = "Your contact page."; return View(); } } }
可以看出Action會在方法執行前後輸出,也在Result前面輸出
二、AuthorizationFilte過濾器
首先執行,在任何其它過濾器動作方法之前執行(授許可權)
1、AuthorizationFilte過濾器繼承AuthorizeAttribute類
2、AuthorizationFilte過濾器呼叫IAuthorizationFilter介面
3、用Request["userType"]是否是vip;如果是測可以訪問,否則就跳轉到百度
4、在Index控制器中新增 [AuthorizationFilterAttribute("vip")]//(授權過濾器)只有Vip角色才能進行訪問Index檢視
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.Mvc; namespace MVCcation.Filters { //過濾器一般以Attribute結尾 //[添加註解][過濾器型別] //授權過濾器AuthorizationFilter 繼承預設介面AuthorizAttribute public class AuthorizationFilterAttribute: AuthorizeAttribute,IAuthorizationFilter { public AuthorizationFilterAttribute(string usertype) { Roles = usertype; } protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext) { string userType = HttpContext.Current.Request["userType"]; if (userType!="vip") { filterContext.Result = new RedirectResult("http://www.baidu.com"); } else Roles.Contains(userType); //base.HandleUnauthorizedRequest(filterContext); } } }
三、Exception過濾器(異常處理)
只在另外一個過濾器,動作方法,動作結果彈出異常時執行(異常處理許可權)
1、Exception過濾器繼承HandleErrorAttribute類
2、Exception過濾器呼叫IExceptionFilter介面
3、當用戶或者訪問者訪問自身沒有許可權訪問頁面,程式會丟擲一個錯誤然後,Exception過濾器處理這個錯誤後會丟擲一個沒有許可權的提示,這裡處理錯誤我是設定跳轉到一個網址
4、還是在Index檢視控制器上新增ExceptionAttribute過濾器
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.Mvc; namespace MVCcation.Filters { public class ExceptionAttribute:HandleErrorAttribute { public override void OnException(ExceptionContext filterContext)//發生異常時呼叫http://www.hermanboke.cn { if (!filterContext.ExceptionHandled) { filterContext.Result = new RedirectResult("http://www.hermanboke.cn");//出現錯誤後跳轉到這個網址 filterContext.ExceptionHandled = true; } base.OnException(filterContext); } } }
這裡我們要在Index控制器裡面故意丟擲一個錯誤,來讓Exception過濾器處理
throw new DllNotFoundException();//丟擲一個異常
[AuthorizationFilterAttribute("vip")]//(授權過濾器)只有Vip角色才能進行訪問Index檢視 [Action]//(執行動作和操作)動作處理器 [Exception]//(錯誤日誌處理器) public ActionResult Index() { throw new DllNotFoundException();//丟擲一個異常 return View(); }
然後執行index檢視;在瀏覽器中輸入http://localhost:50003/Home/Index?userType=vip就會跳轉到指定錯誤的頁面