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));
            }
        }
    }
  • 相关阅读:
    Oracle系列二 基本的SQL SELECT语句
    Oracle系列一 SQL语句基本概念和学习准备
    Android 动态更换桌面图标
    Linux_CentOS下搭建Nodejs 生产环境-以及nodejs进程管理器pm2的使用
    Linux_CentOS中Mongodb4.x 安装调试、远程管理、配置 mongodb 管理员密码
    Linux_CentOS 中systemctl 管理服务、防火墙 firewalld 以及 SELinux 配置
    Linux_CentOS 内存、cpu、进程、端口、硬盘管理
    Linux_CentOS中的MySQL 数据库的安装调试、远程管理
    LInux_CentosOS中yum安装jdk及配置环境变量
    Linux_CentOS软件安装调试 源代码包编译安装和 二进制包配置
  • 原文地址:https://www.cnblogs.com/accessking/p/6831268.html
Copyright © 2011-2022 走看看