zoukankan      html  css  js  c++  java
  • ASP.NET MVC的过滤器

    何谓过滤器

    过滤器又名为筛选器,能够为我们优雅的处理某一类需求提供解决方案,比如用户登录、自定义数据上下文初始化、捕获异常、发布公告等。从功能性上来讲过滤器没什么与优势,即过滤器可实现的功能也可以通过传统 命令式编程 方式实现。之所以推荐使用过滤器编程,是因为过滤器在优化系统/代码结构,提高代码可读性上更优异。

    接下来用一个简单的例子说明下,

    public class LogErrorFilter : FilterAttribute, IExceptionFilter
    {
        public void OnException(ExceptionContext filterContext)
        {
            LogHelper.LogDetail(filterContext.Exception);
        }
    }
    

    Filter的使用

    1. 使用声明的方式在Controller

      [LogErrorAttribute]
      public class HomeController : Controller
      {
      public ActionResult Index()
      {
      throw new NotImplementedException();
      }
      public ActionResult Login()
      {
      throw new NotImplementedException();
      }
      }

    LogErrorAttribute将会作用在Index和Login两个Action上

    1. 使用声明的方式在Action上

      public class HomeController : Controller
      {
      [LogErrorAttribute]
      public ActionResult Index()
      {
      throw new NotImplementedException();
      }
      public ActionResult Login()
      {
      throw new NotImplementedException();
      }
      }

    LogErrorAttribute仅会作用在Index一个Action上。

    1. 将LogErrorAttribute注册到 HttpApplication中,即在Global的Application_Start方法做如下操作

       protected void Application_Start()
       {
           GlobalFilters.Filters.Add(new LogErrorAttribute());
       }
      

    如果项目中存在FilterConfig类,则可以这样操作

        public static void RegisterGlobalFilters(GlobalFilterCollection filters)
        {
            filters.Add(new HandleErrorAttribute());
            filters.Add(new LogErrorAttribute());
        }
    

    这样,LogErrorAttribute就会记录该web项目所有Action引发的异常。

    System.Web.Mvc 下的过滤器接口

    自定义Authorization Filter

    自定义的授权过滤器可以通过继承FilterAttribute和实现IAuthorizationFilter来实现,覆写的接口OnAuthorization
    对于需要拦截的请求只需要给AuthorizationContext的Result属性赋值即可。

    public class LoginCheckFilterAttribute : FilterAttribute,IAuthorizationFilter
    {
        public void OnAuthorization(AuthorizationContext filterContext)
        {
            if (!AuthorizeCore(filterContext)) //具体验证用户的逻辑
            {
                var url = HttpUtility.UrlEncode(filterContext.HttpContext.Request.RawUrl);
                filterContext.Result = new RedirectResult((new UrlHelper(filterContext.RequestContext)).Content("/Login/Index?returnUrl=" + url));
            }
        }
    }
  • 相关阅读:
    PHP 使用 GET 传递数组变量
    Java实现 蓝桥杯 算法训练 数据交换
    Java实现 蓝桥杯 算法训练 数据交换
    Java实现 蓝桥杯 算法训练 数据交换
    Java实现 蓝桥杯 算法训练 景点游览
    Java实现 蓝桥杯 算法训练 景点游览
    Java实现 蓝桥杯 算法训练 景点游览
    Java实现 蓝桥杯 算法训练 二进制数数
    Java实现 蓝桥杯 算法训练 二进制数数
    Java实现 蓝桥杯 算法训练 二进制数数
  • 原文地址:https://www.cnblogs.com/accessking/p/6831268.html
Copyright © 2011-2022 走看看