ASP.NET Filers用来在MVC框架的不同请求处理阶段,注入额外的逻辑。过滤器为横切关注点提供了一种方法(日志记录,授权,缓存)。

       在这篇文章中,我将会向你介绍MVC框架支持的各种不同种类过滤器,怎样控制过滤器的执行,怎样创建和使用过滤器。我们可以创建自定义的过滤器。在每一个请求中,控制器中的方法会检查,是否用户是正确授权的,如果是正确授权的用户,就会允许用户执行相应的方法,显示相应的视图给用户。

       ASP.NET支持四种类型的过滤器。Authentication过滤器是在ASP.NET MVC 5中介绍的。每种过滤器都允许你在请求的不同阶段,注入相应逻辑处理。

Filters Type【过滤器类型】 Interface【接口】  
Authentication【验证过滤器】 IAuthenticationFilter 在所有其他的过滤器或者Action方法之前执行
Authorization【授权过滤器】 IAuthorizationFilter 在允许其他过滤器或者Action方法之前,执行
Action【Action过滤器】 IActionFilter 在Action方法之前或者之后执行
Result【结果过滤器】 IResultFilter 在Action方法的执行结果之前或者之后执行
Exception【异常过滤器】 IExceptionFilter 只有在其他过滤器,Action方法,或者Action的执行结果执行的时候出现异常,才会执行异常过滤器

ASP.NET 中的过滤器类型以及它们的执行顺序

1.Authentication Filters【验证过滤器】

Authentication 过滤器在任何其他过滤器或者Action方法之前执行。Authentication 过滤器确保你是合法还是非法用户。它实现了IAuthenticationFilter接口。

2.Authorization Filters【授权过滤器】

AuthorizeAttribute和RequireHttpsAttribute都是Authorizatio过滤器的例子。授权过滤器用来检查用户是否有访问权限。授权过滤器实现了IAuthorizationFilter接口。

3.Action Filters【Action过滤器】

Action过滤器是一个特性,你可以应用到控制器的方法上,也可以应用到整个控制器上。这个过滤器将会在Action方法开始执行之前或者开始执行之后执行,以及Action执行之后开始调用。

Action过滤器实现了IActionFilter接口,有两个方法OnActionExecuting和OnActionExecuted。OnActionExecuting在Action方法之前执行,并给了一个机会来取消执行Action方法。这些过滤器包含了一些逻辑,在Action方法执行之前或者执行之后调用,你可以使用Action过滤器,来修改控制器中的Action方法返回的视图数据。

4.Result Filters【结果过滤器】

OutputCacheAttribute类就是结果过滤器的一个例子。结果过滤器实现了IResultFilter接口。和IActionFilter类似,也有OnResultExecuting和OnResultExecuted两个方法。这些过滤器包含一些逻辑,在ViewResult开始执行之前或者之后调用。你可以使用结果过滤器,来修改视图的结果,在视图呈现到浏览器之前。

5.Exception Filters【异常过滤器】

HandleErrorAttribute类是ExceptionFilters的一个例子。异常过滤器实现了IExceptionFilter接口,异常过滤器在程序运行的过程中如果发生了未处理的异常就会执行。这些过滤器可以用做异常过滤器,用来处理控制器中的Action方法的错误,或者Action方法返回结果的错误。你可根据需要以重写这些方法。

 

好了,上面的理论知识介绍的差不多,我们来创建一个项目,练练手,实际操作一下:

1.在ASP.NET MVC 5中创建一个自定义的Authentication过滤器

创建一个MV项目:

在项目中,创建一个文件夹AuthData,添加我们自定义的类AuthAttribute;

 

 IAuthenticationFilter接口定义了两个方法:OnAuthentication和OnAuthenticationChallenge。OnAuthentication先执行,用来处理需要的验证逻辑。OnAuthenticationChallenge用来根据用户验证的结果,进一步做限制处理。在OnAuthentication方法中,我写了一些代码用来对用户作验证,OnAuthenticationChallenge中,我写了一些代码,用来执行其他任务。

 现在,让我们来测试一下,我们写的自定义验证过滤器;

 

 运行项目,然后注册:

 

 

 

 

 

 你还可以管理你的账户信息:

 

 2.现在看看 Authorization Filter:

Authorization确保只有经过允许的用户才能访问。这些过滤器在Action方法执行之前调用,实现了IAuthorizationFilter接口。包含了一个方法OnAuthorization。

为了验证Authorization,我们对刚才的AuthAttribute类作个修改。我们重写了AuthorizeAttribute类中的AuthorizeCore(HttpContextBase httpContext)方法。

现在打开Home控制器,修改代码:

 

运行项目:输入刚才注册的账号和密码:可以看到授权通过,登录成功了。

 还可以这样:在About方法上标识特性,然后允许项目,点击关于按钮,就会弹出来登录页面,让登录:

还可以限制,只让某个用户看到About页面,可以这样做:这里,我只让649713412@qq.com这个用户访问About页面。

 

 现在我们运行项目,重新注册一个账号123456@qq.com.

可以看到,123456@qq.com这个账号访问不了About页面。又弹出来了登录页面。

 

 3.再来看看Action Filter,又下面的几个Action Filters:

  1. Output Cache:缓存控制器的Action
  2. Handle Error:当控制器的方法报错的时候,处理错误
  3. Authorize :允许你限制有相应权限的才能访问

Output Cache

下面的例子,指定返回值将会被缓存5秒

 

 

 

再看看Handle Error例子:

为了实现Handle例子,我们改装一下AuthAttribute类:

注意我们需要创建一个静态的错误页面:

 

 然后运行项目,在地址栏输入

 

 然后就看到了:错误页面》》

 

 输入大于100的试试:

 

 

 

 

 好了 ,以上就是Filters的全部内容,有不明白的,欢迎留言。目前这个0基础系列,暂时先告一段落,我打算写一些高级的内容,后续如果有基础的知识需要讲,就接着这个系列写。谢谢大家支持。

 

版权声明:本文为caofangsheng原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/caofangsheng/p/10574559.html