mvc Filters 过滤器

项目需要控制controller和action的访问权限。

看了下资料,发觉还是很方便的。

首先在mvc项目下创建一个文件夹 Filters,

然后在Filters中创建一个类。代码如下

namespace API.Filters
{
    [AttributeUsage(AttributeTargets.Method | AttributeTargets.Class, Inherited = true, AllowMultiple = true)]
    public class APISignAttribute : ActionFilterAttribute
    {
        public static readonly string APISign = WebConfigurationManager.AppSettings["APISign"];

        public override void OnActionExecuting(HttpActionContext actionContext)
        {
            //string a = "统一处理";
        //var q = HttpContext.Current.Session["a"] == null ? "" : HttpContext.Current.Session["a"].ToString();
      //使用filterContext.ActionParameters["sign"]可以修改参数
      //HttpContext.Current.Request.Form["sign"] 不能修改参数
      //filterContext.ActionParameters["sign"] = sign + "123"


            //Son继承自Father,这里可以直接获取传递过来的model
            var q = (Father)actionContext.ActionArguments["model"];

            if (IsVaild(actionContext))
            {
                base.OnActionExecuting(actionContext);
            }
            else
            {
                throw new Exception("Invalid sign");
            }

        }

        public bool IsVaild(HttpActionContext actionContext)
        {
            if (HttpContext.Current.Request.QueryString["sign"] != null)
              return true;
            return false;
        }

        public override void OnActionExecuted(HttpActionExecutedContext actionExecutedContext)
        {
            // 若发生例外则不在这边处理
            if (actionExecutedContext.Exception != null)
                return;

            base.OnActionExecuted(actionExecutedContext);
        }
    }
}


然后就可以使用了。

namespace API.Controllers
{
    //可以在controller下,
    //这样代表整个controller中的action都有权限控制
    [APISignAttribute]
    public class TestController : BaseControllerAPI
    {
        [HttpGet]
        public string Get()
        {
            return "value";
        }

        //也可以在单个action下
        [APISignAttribute]
        [HttpGet]
        public string haha(Son model)
        {
            return "value1";
        }
    }
}

如果你的所有访问都需要权限控制。

那么可以在  RouteConfig  和 WebApiConfig中增加以下代码

public static void Register(HttpConfiguration config)
        {

            //注册 sign统一验证
            config.Filters.Add(new APISignAttribute());
        }

PS:如果过滤器不执行,那么命名空间可能有问题 

WebAPI:System.Web.Http.Filters

MVC:System.Web.Http.Mvc

原文地址:https://www.cnblogs.com/hanjun0612/p/9779871.html