zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    linux
    【转】三种地理参考信息模型:WMS,WFS,WCS
    Flex工程与Asp.net工程集成发布时若干注意事项
    招聘Asp.NET高级开发人员
    【转】2008'中国地理信息系统优秀工程公示
    推荐一本GIS的好书《空间数据库》
    集中推荐一些Map Projection方面资源
    收藏几篇虚拟化的文章
    征集“地图制图”WEB站点、BBS
    [转]NHibernate文章转载
  • 原文地址:https://www.cnblogs.com/hanjun0612/p/9779871.html
Copyright © 2011-2022 走看看