笨鸟先飞之ASP.NET MVC系列之过滤器(01过滤器简介)

过滤器

什么是过滤器?

过滤器(Filter) 主要的作用大致可以理解为把我们的附加逻辑注入到MVC框架的请求处理。

在ASP.NET MVC的请求处理中一种有19个管道事件分别是

  1. BeginRequest:HTTP管道开始处理请求时,会触发BeginRequest事件
  2. AuthenticateRequest:安全模块对请求进行身份验证时触发该事件
  3. PostAuthenticateRequest:安全模块对请求进行身份验证后触发该事件
  4. AuthorizeRequest:安全模块对请求进程授权时触发该事件
  5. PostAuthorizeRequest:安全模块对请求进程授权后触发该事件
  6. ResolveRequestCache:缓存模块利用缓存直接对请求进程响应时触发该事件
  7. PostResolveRequestCache:缓存模块利用缓存直接对请求进程响应后触发该事件
  8. PostMapRequestHandler:对于访问不同的资源类型,ASP.NET具有不同的HttpHandler对其进程处理。对于每个请求,ASP.NET会根据扩展名选择匹配相应的HttpHandler类型,成功匹配后触发该事件
  9. AcquireRequestState:状态管理模块获取基于当前请求相应的状态(比如SessionState)时触发该事件
  10. PostAcquireRequestState:状态管理模块获取基于当前请求相应的状态(比如SessionState)后触发该事件
  11. PreRequestHandlerExecute:在实行HttpHandler前触发该事件
  12. PostRequestHandlerExecute:在实行HttpHandler后触发该事件
  13. ReleaseRequestState:状态管理模块释放基于当前请求相应的状态时触发该事件
  14. PostReleaseRequestState:状态管理模块释放基于当前请求相应的状态后触发该事件
  15. UpdateRequestCache:缓存模块将HttpHandler处理请求得到的相应保存到输出缓存时触发该事件
  16. PostUpdateRequestCache:缓存模块将HttpHandler处理请求得到的相应保存到输出缓存后触发该事件
  17. LogRequest:为当前请求进程日志记录时触发该事件
  18. PostLogReques:为当前请求进程日志记录后触发该事件
  19. EndRequest:整个请求处理完成后触发该事件

过滤器是.NET的注解属性(Attribute),它们对请求管道添加了额外的步骤。

过滤器分类

MVC框架一共支持6种不同类型的过滤器

过滤器类型接口需实现功能介绍
认证过滤器IAuthenticationFilterOnAuthentication、OnAuthenticationChallenge在任何其他过滤器或动作方法之前运行,但在授权过滤器之后可再次运行
授权过滤器IAuthorizationFilterOnAuthorization在认证过滤器之后,在其他过滤器或方法前运行
动作过滤器IActionFilterOnActionExecuted、OnActionExecuting在方法之前及之后运行
结果过滤器IResultFilterOnResultExecuted、OnResultExecuting在结果被执行之前和之后运行
异常过滤器IExceptionFilterHandleErrorAttribuite仅在另一个过滤器、方法或结果抛出异常时运行
重载过滤器IOverrideFilterFiltersToOverride当你需要方法仅受直接运行在它上面的过滤器影响时使用

重载过滤器认证过滤器是MVC5的新特性

使用过滤器

在MVC中系统自带了一些常规的过滤器比如如果我们想过滤get请求就可以用HttpPost过滤器。

如果我们想过滤某个方法让其只能使用Post请求我们可以这么做。

首先我们先新建一个MVC的项目,为了方便演示我们直接创建自带的模板项目。
我们来看看使用过滤器之前的运行效果

现在我们加上过滤器

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

            return View();
        }

        public ActionResult Contact()
        {
            ViewBag.Message = "Your contact page.";

            return View();
        }
    }

那么现在我们的About方法就只能通过Post请求来访问
774226-20171005162341365-1319978677.gif
774226-20171005162558052-793883214.gif

我们看到通过Get请求我们访问的就是404了

为了认证是否只有Post请求可以访问,我又试着发了个Post请求我们对比一下
Get:
774226-20171005162256536-1002253826.png

Psot:
774226-20171005162306365-1191922135.png

现在我们知道了如果在某个方法中添加过滤器,但是我们有个问题,如果像授权过滤器这种,我们要一个个方法去加不是特别麻烦吗?那我们该怎么做呢?这个时候我们可以直接在控制器最外面打上标记

    [Authorize]
    public class HomeController : Controller
    {

        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();
        }
    }

现在我们访问这些方法就会进行校验就必须先登录才能访问,我们再来看一下效果
774226-20171005162423146-216856338.gif

当然我们还能组合使用过滤器比如

public class HomeController : Controller
    {

        public ActionResult Index()
        {
            return View();
        }
        [Authorize]
        [HttpPost]
        public ActionResult About()
        {
            ViewBag.Message = "Your application description page.";

            return View();
        }

        public ActionResult Contact()
        {
            ViewBag.Message = "Your contact page.";

            return View();
        }
    }

我们再来看看我们使用Post请求后会立即跳转到登录页进行认证
774226-20171005163053927-1593311856.png

好了我们本次的过滤器简介就先介绍到这里,下一章开始我带大家来领略不同过滤器的具体用法

开新坑了,最开始只把写博客当成一种消遣,现在慢慢养成一种习惯了吧,也希望MVC系列大家能够喜欢,我是个菜鸡如果有写的不好的地方还望大家多多海涵

转载于:https://www.cnblogs.com/chen-jie/p/APS-NET-MVC-Filter.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值