码迷,mamicode.com
首页 > Web开发 > 详细

MVC初体验-过滤器(10)

时间:2020-02-03 15:47:16      阅读:94      评论:0      收藏:0      [点我收藏+]

标签:work   end   理解   重写   使用方法   message   nbsp   control   custom   

主要有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

MVC初体验-过滤器(10)

标签:work   end   理解   重写   使用方法   message   nbsp   control   custom   

原文地址:https://www.cnblogs.com/LeeSki/p/12254869.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!