zoukankan      html  css  js  c++  java
  • MVC初体验-过滤器(10)

    主要有4中过滤器:

     1.Authorization  身份验证过滤器

    理解身份验证过滤器和无侵入式开发;

     假如我这里有学生和教室两个对象,学生进入教室需要进行身份验证,如果在A学生上增加验证,那么在代码层面就构成了侵入式开发,需要修改学生A的代码,如果多了一个学生C,那么又需要继续增加验证代码,不合适;

    如果在教室对象上增加身份验证代码,如果新增了教室D,那么身份验证又需要重写,同时也构成了侵入式开发;

    所以最好的方案是不修改学生和教室,在它们中间加入一层中间验证,哪个教室需要身份验证,就给它加入一个验证标签即可;

    通过特性的方式打标记,决定哪些类或者行为需要进行验证;

    特性怎么使用的:

     

    身份验证过滤器怎么写: 

    如何自定义写过滤器(代码):

    1)方法一:

    ①首先新建一个Filter文件夹(非必须,便于管理),新建一个MyAuthorization类,然后继承AuthorizationAttribute,然后重写OnAuthorization方法;

        public class MyAuthorization:AuthorizeAttribute 
        {
            public override void OnAuthorization(AuthorizationContext filterContext)
            {
                //如果保留如下代码,则会运行.net framework定义好的身份验证,如果需要使用自定义身份验证,则禁用下列代码
                //base.OnAuthorization(filterContext);
    
                //获取Http上下文内容
                filterContext.HttpContext.Response.Write("123456");
    
                //如果需要实现页面跳转功能,需要使用Result,而不是使用Respon.Redirect(),
                //因为第二种方案服务端的代码仍然会继续往下执行,不会停止
                //filterContext.Result = new RedirectResult("controller/action");
            }
        }

     ②应用特性到行为或者控制器;

        [MyAuthorization]
        public class HomeController : Controller
        {
            [MyAuthorization]  
            public ActionResult Index()
            {
                return View();
            }
    
            public ActionResult About()
            {
                ViewBag.Message = "Your application description page.";
    
                return View();
            }
        
            public ActionResult Contact()
            {
                ViewBag.Message = "Your contact page.";
    
                return View();
            }
        }

    可以放置过滤特性标签到控制器类上或者行为上。

    如何全局注册过滤器,使得所有的控制器,行为都具有过滤特性;

     在Global文件中的

    FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);

    RegisterGlobalFilters中增加下面代码即可

    //所有都有了身份验证
    filters.Add(new MyAuthorization());

    2)方法二:

    重写控制器的内部OnAuthorization方法,这样会应用过滤于控制器下的所有行为;

    public class HelloController : Controller
        {
            // GET: Hello
            [MyAuthorization]
            public ActionResult Index()
            {
                return View();
            }
            //重写此方法即可,在执行顺序上优先调用该验证
            protected override void OnAuthorization(AuthorizationContext filterContext)
            {
                filterContext.HttpContext.Response.Write("Inner Hello!");
            }
        }

    缺点:灵活性不够,推荐使用特性的方式,但是这种也可以。

    2.异常处理过滤器

     

     怎么做:

    首先还是定义一个过滤器的类,该类继承开篇提到的HandleErrorAttribute类,然后类中重写OnException方法;

        public class MyException:HandleErrorAttribute
        {
            public override void OnException(ExceptionContext filterContext)
            {
                //如下代码不可删除,否则将无法捕获到异常
                base.OnException(filterContext);
    
                //记录日志
    
                //页面跳转
                filterContext.Result = new RedirectResult(@"/Error/400.html");
            }
        }

    因为异常过滤器一般会设置在全局环境中,那么在注册过滤器的代码中需要这么样写:

    public class FilterConfig
        {
            public static void RegisterGlobalFilters(GlobalFilterCollection filters)
            {
                //系统默认的异常处理过滤器,如果使用自定义异常处理,要禁用如下代码
                //filters.Add(new HandleErrorAttribute());
                //异常捕获
                filters.Add(new MyException());
    
                //所有都有了身份验证
                filters.Add(new MyAuthorization());
                
            }
        }

    光有了这些还不够,直接执行异常的话会报错,是因为在webconfig中的system.web下增加customErrors标签,并且设置mode属性为On即可;

    <system.web>
        <customErrors mode="On"></customErrors>
        <compilation debug="true" targetFramework="4.5"/>
        <httpRuntime targetFramework="4.5"/>
      </system.web>

    然后在项目中新建一个Error文件夹,再新建一个400.html文件即可。

    同理身份验证,也可以在控制器类中重写OnException方法,然后将该控制器作为自定义基类控制器,让子类的行为都具有异常处理。

    3.行为过滤器

     还是在Filter文件夹下增加一个MyActionFilter类,然后继承ActionFilterAtterbute,根据需要去重写行为执行前或者行为执行后的 过滤方法即可;

    public class MyActionFilter:ActionFilterAttribute
        {
            //想在行为执行前就重写行为执行前的方法,反之亦然,不必要两个方法都重写
    
            //行为执行前
            public override void OnActionExecuting(ActionExecutingContext filterContext)
            {
                filterContext.HttpContext.Response.Write("行为执行前:");
            }
            //行为执行后
            public override void OnActionExecuted(ActionExecutedContext filterContext)
            {
                filterContext.HttpContext.Response.Write("行为执行后!!!!");
            }
        }

    然后按照使用特性的方式去使用行为过滤器;

    同理,也可以重写控制器类中OnActionExect[ing/ed] 方法,或者在全局中使用。

    4.结果过滤器

    同行为过滤器使用方法

    总结:

    End

  • 相关阅读:
    linux下Tomcat配置提示权限不够解决办法
    Linux 生成SSL证书 供 nginx使用
    mysql存储emoji表情报错的处理方法【更改编码为utf8mb4】
    Linux Mysql 备份与还原
    Linux 安装Mysql
    Linux 卸载Mysql
    Linux yum安装java环境
    InMemoryUploadedFile对象复制到磁盘中的临时路径
    在django中使用(配置)celery
    使用ffmpeg以mp4的格式保存视频
  • 原文地址:https://www.cnblogs.com/LeeSki/p/12254869.html
Copyright © 2011-2022 走看看