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的执行结果执行的时候出现异常,才会执行异常过滤器 |
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:
Output Cache
下面的例子,指定返回值将会被缓存5秒
再看看Handle Error例子:
为了实现Handle例子,我们改装一下AuthAttribute类:
注意我们需要创建一个静态的错误页面:
然后运行项目,在地址栏输入:
然后就看到了:错误页面》》
输入大于100的试试: