MVC-AOP思想-Filter 三种注册方式

  在ASP.NET MVC框架中,为我们提供了四种类型的Filter类型包括:IAuthorizationFilter、IActionFilter、IResultFilter、IExceptionFilter,执行顺序如下:

  IAuthorizationFilter 最先执行的,在这些Filter中,我们可以说它的执行优先级是最高的,用于身份验证并对控 制器中的action进行授等进行逻辑处理

  IActionFilter 在IAuthorizationFilter之后执行,包含两个方法,在controller中的action执行之前、执行之后 进行逻辑处理

  IResultFilter 同样包含两个方法,在IActionFilter之后执行,在返回View之前和返回View之后执行逻辑处理

  IException 主要用于对异常信息进行处理


 首先看下IAuthorizationFilter身份验证,且优先级最高,这里我们override它唯一的OnAuthorization():

 1 public override void OnAuthorization(AuthorizationContext filterContext)
 2         {
 3             if (filterContext.ActionDescriptor.IsDefined(typeof(AllowAnonymousAttribute),true))
 4             {
 5                 return;  //方法上面有这个特性,通过检查   
 6             }
 7             else if(filterContext.ActionDescriptor.ControllerDescriptor.IsDefined(typeof(AllowAnonymousAttribute),true))
 8             {
 9                 return; //控制器上面有特性也可以通过检查
10             }
11             //filterContext.HttpContext.Session[""];
12             //filterContext.HttpContext.Request.Cookies
13             if (filterContext.HttpContext.Request.QueryString["Account"]!=null && filterContext.HttpContext.Request.QueryString["Account"].Equals("Admin")&& filterContext.HttpContext.Request.QueryString["PWD"].Equals("123456")&& filterContext.HttpContext.Request.QueryString["PWD"]!=null) //模拟检测,实际检测session和cookie
14             {
15                 return; //这里身份验证只是模拟,实际中肯定不会这么shit
16             }
17             else
18             {
19                 filterContext.HttpContext.Session["URL"] = filterContext.HttpContext.Request.RawUrl;  //当前地址记录给session,登陆后返回当前页面
20                 filterContext.Result = new RedirectResult("~/Home/Contact");
21             }
22             //base.OnAuthorization(filterContext);
23         }


  然后呢,重载完了之后怎么使用呢,上马:

namespace MVC.Controllers
{
    [CustomAuthorite]  //一:在类上注册,整个类都会调用检查
    public class HomeController : Controller
    {
        /// <summary>
        /// 用户登录后才可以访问
        /// </summary>
        /// <returns></returns>
        //[Authorize] 
        public ActionResult Index()
        {
            
            return View();
        }
        [CustomAuthorite]  //二:权限特性,检测权限登录,在方法上注册,只对单个方法有效
        public ActionResult About()
        {
            ViewBag.Message = "Your application description page.";

            return View();
        }
        public ActionResult Regex(int year,int month,int day) {
            return View();
        }
        [AllowAnonymous] // 跳过检查
        public ActionResult Contact()
        {
            ViewBag.Message = "Your contact page.";

            return View();
        }
    }
}

  还有第三种注册方式:

可以看出以Filter形式给出的,说明它有能力以特性的形式‘贴’在控制器Controller或Action上,让代码更为‘优美’!因为Filter微软也给我们留了‘FilterConfig’入口,可以全局性的‘注入’

public static void RegisterGlobalFilters(GlobalFilterCollection filters)
        {
            filters.Add(new HandleErrorAttribute());
            filters.Add(new CustomAuthorite());  //全局注册登录验证Filter
            filters.Add(new ExceptionFilter());   //全局注册ExceptionFilter
        }

 下面再简单看下IExceptionFilter:

public class ExceptionFilter:FilterAttribute,IExceptionFilter
    {
        /// <summary>
        /// 异常发生的时候被调用
        /// </summary>
        /// <param name="filterContext"></param>
        public void OnException(ExceptionContext filterContext)
        {
            
            filterContext.Controller.ViewData["ErrorMessage"] = filterContext.Exception.Message; //此处exception是异常类型实例
            filterContext.Result = new ViewResult()
            {
                ViewName = "ExceptionIndex", //出错后跳转的页面
                ViewData = filterContext.Controller.ViewData
            };
            filterContext.ExceptionHandled = true; //告诉系统异常已经处理了,不用再处理了
        }
    }

  具体用法同上.

  可以看出MVC中的AOP思想较传统的webform还是方便了很多的,各司其职,使用起来也更加方便,使得业务逻辑不受框架的干扰,而且扩展起来也很方便,身份验证,异常处理等一些公用的逻辑和业务逻辑机本上完全分离.

猜你喜欢

转载自www.cnblogs.com/Godlovezk/p/9012400.html