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