• 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

  • 相关阅读:
    路由器欺骗(原始套接字五)
    ICMP拒绝服务攻击(原始套接字系列四)
    ping的实现(原始套接字系列三)
    原始套接字基础(原始套接字系列二)
    原始套接字简介(原始套接字系列一)
    MMS服务学习
    转 Qt 翻译
    为应用程序设置一个图标 (窗口左上角 程序图标)
    正则表达式
    《TCP/IP详解 卷1:协议》第4章 ARP:地址解析协议
  • 原文地址:https://www.cnblogs.com/hanjun0612/p/9779871.html
Copyright © 2020-2023  润新知