ASP.NET MVC 学习笔记之面向切面编程与过滤器

AOP(面向切面)是一种架构思想,用于把公共的逻辑放到一个单独的地方,这样就不用每个地方都写重复的代码了。比如程序中发生异常,不用每个地方都try…catch 只要在GolbalApplication_Error中统一进行异常处理。 

不用每个Action中都检查当前用户是否有执行权限。ASP.NETMVC 中提供了一个机制,每个Action执行之前我们都会执行我们的代码,这样统一检查即可。 

一夫当关万夫莫开! 

  

四种Filter 

ASP.NET MVC中提供了四个Filter(过滤器)接口实现了 这种AOP机制,IAuthorizationFilterIActionFilterIResultFilterIExceptionFilter 

  1. IAuthorizationFilter 一般用来检查当前用户是否有Action的执行权限,在每个Action被执行之前执行OnAuthorization方法 

  2. IActionFilter也是在每个Action被执行前执行OnActionExecuting方法,每个Action执行完成后执行OnActionExecuted方法,和IAuthorizationFilter的区别是IAuthorizationFilterIActionFilter这样,检查权限一般写到IAuthorzationFilter 

  3. IResultFilter,在每个ActionResult的前后执行IResultFilter。用的很少 

  4. IExceptionFilter,当Action执行发生未处理异常的时候执行OnException方法,在MVC中仍然可以使用Global Application_Error 但建议使用IExceptionFilter 

定义的自定义Filter 可以在Global GlobalFilters.Filters.Add(new XXXFilter());的方式添加为全局的过滤器、。 

 

示例:

CheckLoginFilter

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;

namespace WebMVC.Filters
{
    public class CheckLoginFilter : IAuthorizationFilter
    {
        public void OnAuthorization(AuthorizationContext filterContext)
        {
            string ctrlName = filterContext.ActionDescriptor.ControllerDescriptor.ControllerName;
            string actionName = filterContext.ActionDescriptor.ActionName;
            if(ctrlName == "Login" &&(actionName == "Index" || actionName == "Login"))
            {
                //什么都不做
            }
            else
            {
                
                if(filterContext.HttpContext.Session["username"] == null)
                {
                    filterContext.Result = new RedirectResult("/Login/Index)");
                }
                else
                {
                    if(filterContext.HttpContext.Session["username"].ToString() != "a")
                    {
                        ContentResult result = new ContentResult();
                        result.Content = "没有权限";
                        filterContext.Result = result;
                    }
                }
            }
        }
    }
}

在Global中添加全局过滤器

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.Web.Routing;
using WebMVC.Filters;
namespace WebMVC
{
    public class MvcApplication : System.Web.HttpApplication
    {
        protected void Application_Start()
        {
            AreaRegistration.RegisterAllAreas();
            RouteConfig.RegisterRoutes(RouteTable.Routes);
            GlobalFilters.Filters.Add(new CheckLoginFilter());
        }
    }
}
原文地址:https://www.cnblogs.com/c-supreme/p/9517630.html