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));
            }
        }
    }
  • 相关阅读:
    堆排序
    cocos2d-x -------之笔记篇 动画的实现
    cocos2d-x -------之笔记篇 3D动作说明
    Cocos2d-x 学习之路------(CCCallfunc 系列)
    cocos2d-x -------之笔记篇 环境的安装
    poj 1141 Brackets Sequence(区间DP)
    1051 接龙游戏
    1229 数字游戏
    java反射机制(笔记)
    Linux中搭建FTP服务器
  • 原文地址:https://www.cnblogs.com/accessking/p/6831268.html
Copyright © 2011-2022 走看看