MVC系统学习6—Filter
Mvc的过滤器是特性类,可以使我们在执行Action之前,执行Action之后,执行Action发生异常时,编写相关的处理代码实现某些逻辑。下面是四个基本的Filter接口。
上面这四个基本的Filter接口又被其他类所继承实现。框架图如下:
可以发现具体的Filter类,如ActionFilterAttribute或者AuthorizeAttribute除了各自实现基本接口IActionFilter和IAuthorizationFilter之外还继承抽象类FilterAttribute,而后者又继承自Attribute类。FilterAttribute除了一个protected的构造函数之外还有一个int类型的Order属性,当在一Controller或者Action上面添加多个相同类型的Filter时定义Filter触发的顺序。ActionFilterAttribute同时继承实现了IActionFilter和IResultFilter接口,这两个接口的函数都实现为abstract函数。如果继承ActionFilterAttribute意味着可以在Action执行之前,之后,Action结果执行之前,之后编写相应的处理代码。
当在一个Action上面定义多个Filter时,如下面的代码。也可以以使用Order属性来控制执行顺序。在编码的过程中发现一个比较蛋疼的问题,就是特性的AllowMultiple会影响到执行顺序和异常抛出时的处理。但是在Mvc的InvokeActionMethodWithFilters源码里面并没有发现对于AllowMultiple的特殊处理呀?奇怪!
[FirstFilter]
[SecondFilter]
public ActionResult Index(string id, string other)
{ ViewData["Message"] = "欢迎使用 ASP.NET MVC!";
ViewData["id"] = id;
ViewData["other"] = other;
return View();
}
/*
First OnActionExecuting
Second OnActionExecuting
Second OnActionExecuted
First OnActionExecuted
First OnResultExecuting
Second OnResultExecuting
Second OnResultExecuted
First OnResultExecuted
*/
/**************** 当吧FirstFilter定义为AllowMultiple = true时的执行顺序是这样的
Second OnActionExecuting
First OnActionExecuting
First OnActionExecuted
Second OnActionExecuted
Second OnResultExecuting
First OnResultExecuting
First OnResultExecuted
Second OnResultExecuted
****************/
/* 当在Second OnActionExecuting中抛出异常时,
* 将会跳到First OnActionExecuted ,Second OnActionExecuted不会执行
* 但是如果FirstFilterAttribute的AllowMultiple = true,异常将不会被拦截,直接抛出
First OnActionExecuting
Second OnActionExecuting
First OnActionExecuted
First OnResultExecuting
Second OnResultExecuting
Second OnResultExecuted
First OnResultExecuted
*/
Controller下的Filter
Controller类除了继承自ControllerBase类之外,还继承了四个基本的Filter接口,这也就意味着同样可以在Controller类里面来定义实现相关方法来实现过滤器的功能,这里有一点需要注意就是Controller里面定义的Filter方法优先级最高,并且不受附加在Controller或者Action之上的Filter的Order影响。These controller filter methods give you a very quick and easy way to add controller code that runs before or after all action methods on that particular controller, or whenever an unhandled exception occurs in that particular controller. 什么时候使用Controller继承自接口的Filter,什么时候自定义一个Filter然后附加在方法之上,这要看情况,当过滤器的方法只是针对某个特殊的Controller时,就使用前者,当过滤器需要被多个Controller公用时,就使用后者。
Authorization Filters
authorization filters 是一个特殊的过滤器,他会在所有其他类型的过滤器触发前被触发。其重要属性如下:
public class MicrosoftController : Controller
{
[Authorize(Users="billg, steveb, rayo", Roles="chairman, ceo")]
public ActionResult BuySmallCompany(string companyName, double price
{
// Cher-ching!
}
}
通过上面的定义将使BuySmallCompany只能被用户名为"billg,steven,rayo"之一,角色为"chairman,ceo"之一的访问者访问到(角色和用户名需为"与关系",就是两个必须都符合,不能是"或关系",即只符合其中一项)。如果用户名或者角色不符合将会被设置为Http状态为401,也就是验证失败的状态,这个401状态将会激活项目中启用的验证系统(如Form验证)自动跳转到登陆页面或者显示一个认证失败的页面。Authorization Filters是根据HttpContext.User来判断用户名和角色的。因此可以同Form验证结合。具体怎么结合还需要另外研究。
在使用Mvc Authorization Filters的时候还需要注意一点。就是当项目中结合使用Output Caching时。在缓存项没有被改变的情况下,action的调用的结果是放在缓存中的,在第一次被被访问时直接将这个结果输出给客户端浏览器,不用在触发调用action,因此action的filter也就不会被调用了。这也就意味着会有这么一种情况,经过授权的用户访问某个action,在这个用户访问之后action的结果被缓存下来,接下来未经授权的用户也可以访问这个action。漏洞就来了!微软Mvc团队有意识到这一点,在缓存输出前还是会调用Authorization Filters再验证一次。这也就意味当在自定义定义Authorization Filters时,最好时继承自Authorization Filters,而不是继承自FilterAttribute和 IAuthorizationFilter。以防止在使用缓存时,出现了安全漏洞。
MVC系统学习6—Filter的更多相关文章
- MVC系统学习1—MVC执行流程
用MVC来做开发也有一段时间了,但是感觉一直没入门,就徘徊在似懂非懂的层次,和去年刚毕业学习WebForm时一样,当时通过张子阳老兄的几篇文章,明白了请求处理流程,页面生命周期才真正明白了WebFor ...
- MVC系统学习5——验证
其实关于Mvc的验证在上一篇已经有讲过一些了,可以通过在我们定义的Model上面添加相应的System.ComponentModel.DataAnnotations空间下的验证属性.在服务器端通过Mo ...
- MVC系统学习2—MVC路由
在MVC下不是通过对物理文件的映射来实行访问的,而是通过定义后的路由Url来实现访问的.在前一篇讲到我们是在全局文件下进行路由配置. routes.MapRoute( & ...
- MVC系统学习3—ModelBinder
在ASP.NET MVC中,每个请求都被映射到一个Action方法,我们可以在action的方法中定义相应类型的参数,View中通过post.get方式提交的request参数,只要名称一致就会对应到 ...
- Mvc系统学习9——Areas学习
在Mvc2.0中,新增加了一个特性就是Areas.在没有有使用Areas的情况下,我们的Mvc项目组织是下面这样的.当项目庞大的时候,Controllers,Model,View文件下下面势必会有很多 ...
- MVC系统学习7—Action的选择过程
在Mvc源码的ControllerActionInvoker的InvokeAction方法里面有一个FindAction方法,FindAction方法在ControllerDescriptor里面定义 ...
- MVC系统学习4—ModelMetaData
在Mvc R2中,新引入了一些扩展方法,如后面带一个for的方法,这些扩展方法会根据Model的属性自定生成相应的Html元素,如Html.EditFor(Model=>Model.IsAppr ...
- MVC系统学习8——AsyncController
关于为什么使用异步Controller,这里不做备忘,三岁小孩都懂.主要的备忘是如何使用AsyncController. //这个action以Async结尾,并且返回值是void public vo ...
- ASP.NET MVC学习笔记-----Filter
ASP.NET MVC学习笔记-----Filter(1) Filter类型 接口 MVC的默认实现 Description Authorization IAuthorizationFilter Au ...
随机推荐
- 利用Marshal.AllocHGlobal申请非托管内存,unsafe代码
unsafe public class RUN { int[] array3; IntPtr handle; ; public RUN() { handleCount = * ; handle = S ...
- 每天学点linux命令之locate 与 find 命令
定位某个文件的位置 方法一 sudo find / -name libGLEW.so.1.13 -type f 方法二 sudo updatedb && locate libopenc ...
- 一命令安装nginx
#!/bin/bash yum -y install wget pcre-devel openssl openssl-devel libtool gcc automake autoconf libto ...
- sdut1933WHUgirls(dp)
http://acm.sdut.edu.cn/sdutoj/problem.php?action=showproblem&problemid=1933 矩形的dp一般挺类似 大的矩形都是由小 ...
- sdut1642Simple Arithmetics(模拟)
链接 发个长长的模拟 这题要注意的地方挺多 -的个数 以及对齐的情况 全都注意好了 大数的加减乘就可以了 #include <iostream> #include<cstdio> ...
- VS Code 设置取消打开文件目录的自动定位跟踪功能。
文件-->首选项-->设置-->在搜索栏中搜索:explorer.autoReveal; 去掉勾选即可.
- BOW-js浏览器对象模型
- VS2010 好用的javascript扩展工具
工具1) JScript Editor Extensions 折叠代码 下载地址: JScript Editor Extensions 工具2) Javascript parser 以树形方式查的代码 ...
- Jvisualvm--JAVA性能分析工具
JDK自带的JAVA性能分析工具.它已经在你的JDK bin目录里了,只要你使用的是JDK1.6 Update7之后的版本.点击一下jvisualvm.exe图标它就可以运行了. 这里是VisualV ...
- Java.io.ObjectOutputStream.writeObject()方法实例
java.io.ObjectOutputStream.writeObject(Object obj) 方法将指定对象写入ObjectOutputStream.该对象的类,类的签名,以及类及其所有超类型 ...