1.四種Filter
在asp.net mvc中提供了四種Filter(過濾器)接口實現了這種AOP機制:IAuthorizationFilter、IActionFilter、IResultFilter、IExceptionFilter。
a.IAuthorizationFilter:在每個Action被執行前執行OnAuthorization方法,一般用來檢查當前用戶是否具有Action的執行權限。
b.IActionFilter:在每個Action被執行前執行OnActionExecuting方法,每個Action執行完成后執行OnActionExecuted方法。和IAuthorizationFilter的區別在於IAuthorzationFilter在IActionFilter之前執行。
c.IResultFilter:在每個ActionResult的前后執行IResultFilter。
d.IExceptionFilter:當Action執行發生未處理異常的時候執行OnException方法。
定義的類可以在Global總GlobalFilters.Filters.Add(new XXXFilter());的方式添加為全局的過濾器。
IAuthorizationFilter接口的使用
登錄權限案例
1.定義兩個控制器,登錄過濾器(LoginController)、登錄成功后的過濾器(MainController)
public class LoginController : Controller { // GET: Login public ActionResult Index() { //請求登錄界面 return View(); } //提交登錄 public ActionResult Login(string txtName,string txtPwd) { if (txtName=="admin"&&txtPwd=="123") { Session["User"] = txtName; return Content("登錄成功!" + Session["User"]); } return Content("登錄失敗"); } }
//登錄成功后才能訪問 public class MainController : Controller { // GET: Main public ActionResult Index() { return Content("歡迎登錄!"+Session["User"]); } public ActionResult Success() { return Content("主界面"+Session["User"]); } }
<html> <head> <meta name="viewport" content="width=device-width" /> <title>Index</title> </head> <body> <div> <form action="~/Login/Login" method="post"> <input type="text" name="txtName" /><br/> <input type="text" name="txtPwd" /><br/> <input type="submit" value="登錄"/> </form> </div> </body> </html>
2.定義實現IAuthorizationFilter接口的類
public class CheckLoginFilter : IAuthorizationFilter { public void OnAuthorization(AuthorizationContext filterContext) { //獲取控制器名字 string controllerName=filterContext.ActionDescriptor.ControllerDescriptor.ControllerName; //獲取Action方法的名字 string actionName = filterContext.ActionDescriptor.ActionName; if (controllerName.ToLower()=="Login".ToLower()&&(actionName.ToLower()=="Login".ToLower()||actionName.ToLower()=="Index".ToLower())) { //什么都不做 } else { if (filterContext.HttpContext.Session["User"]==null) { ContentResult contentResult = new ContentResult(); contentResult.Content = "沒有登錄!"; //當執行filterContext.Result后,url中沒有權限的路徑就無法執行Action的方法了,就是阻止了沒有權限的Action方法 filterContext.Result = contentResult; } } } }
重定向:filterContext.Result = new RedirectResult("/login/index");或filterContext.HttpContext.Response.Redirect("/login/index");
第二個重定向不建議使用
3.在Global中添加GlobalFilters.Filters.Add(new CheckLoginFilter());
IExceptionFilter接口的使用
用法和IAuthorizationFilter接口用法一致,捕獲異常:Exception ex= filterContext.Exception;