一步步学习ASP.NET MVC3 (15)——过滤器
请注明转载地址:http://www.cnblogs.com/arhat
今天老魏和大家一起讨论一下ASP.NET MVC中非常重要的一个知识:“过滤器”。那么这个“过滤器”乍一听好像在ASP.NET中并没有这个东东,反而在J2EE中常常提到这个知识,其实在传统的ASP.NET中是存在“过滤器”的,只不过我们平时并没有注意到它。反而到ASP.NET MVC中,这个“过滤器”就提到一个非常重要的位置。“过滤器”可以使我们在实现某些操作的时候非常的重要,如果没有“过滤器”那么实现某些功能的时候就比较困难,比如登录验证等操作,或者是处理一些敏感的数据。
那么下面我们看看什么是“过滤器”。从名字上看“过滤器”的意思是就是把一些不需要东西给过滤掉,其实就像我们平时的下水管道一样,有一个过滤网,这个过滤网就是把一下事物残渣过滤掉,防止堵塞下水管道。那么在ASP.NET MVC中的“过滤器”也是这个作用。
只不过在ASP.NET MVC过滤器中所过滤的不是水,而是一个HttpRequest.而食物残渣就好比是HttpRequest所带的数据,我们可以定义一下过滤器的规则,把不需要的数据给过滤掉,只把合法的数据传递到服务器中并处理。
在Asp.net Mvc中当你有以下及类似以下需求时你可以使用Filter功能
1. 判断登录与否或用户权限
2. 决策输出缓存
3. 防盗链
4. 防蜘蛛
5. 本地化与国际化设置
6. 实现动态Action
上面说了那么多文字内容,可能还是不是很清楚过滤器所处的位置,那么下面我们通过一个图来了解一下这个“过滤器”。

这个图是老魏自己画的,没有采用微软的图。在浏览器发送请求的时候,这个请求会会在执行Action之前先过滤一下这个请求,把合法内容留下并传递给Aciton执行,当执行完毕之后服务器把处理结果发送给浏览器之前也就是执行Action之后还得在经历一个过滤器,这个过滤器可以什么都不做,也可以对Action的执行结果进行修改再次的发送给浏览器。这个就是过滤器的执行过程。
在APS.NET MVC中提供几种默认的过滤器。
| Filter Type | 实现接口 | 执行时间 | Default Implementation |
| Authorization filter | IAuthorizationFilter | 在所有Filter和Action执行之前执行 | AuthorizeAttribute |
| Action filter | IActionFilter | 分别在Action执行之前和之后执行。 | ActionFilterAttribute |
| Result filter | IResultFilter | 分别在Action Result执行之后和之前 | ResultFilterAttribute |
| Exception filter | IExceptionFilter |
只有在filter, 或者 action method, 或者 action result 抛出一个异常时候执行 |
HandleErrorAttribute |
这四种过滤器AuthorizeAttribute,ActionFilterAttribute,ResultFilterAttribute,HandleErrorAttribute都是ASP.NET MVC提供的默认过滤器。如果我们要使用这些过滤器的时候,需要继承这些类。由于这些类都是Attribute,所以我们的子类必须是以Attribute结尾的。
那么我们以ActionFilterAttribute为例来介绍一下过滤器。这个过滤器是针对Action的,那么这个Attribute必须只能作用于Action,也就是在Action执行之前,执行之后的过滤器。
在ActionFilterAttribute中,提供了四种方法来处理Action的请求过滤。
//在Action执行之后 public virtual void OnActionExecuted(ActionExecutedContext filterContext); //在Action执行之前 public virtual void OnActionExecuting(ActionExecutingContext filterContext); //解析ActionResult前执行 public virtual void OnResultExecuted(ResultExecutedContext filterContext); //解析ActionResult后执行 public virtual void OnResultExecuting(ResultExecutingContext filterContext);
我们来试验一下,在我们的项目中创建一个文件夹Filter用来存放我们的过滤器。

首先,我们在Filter文件夹中创建一个过滤器“MyActionFilter.cs”,内容如下:
public class MyActionFilterAttribute:ActionFilterAttribute
{
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
filterContext.HttpContext.Response.Write("执行Action之前....<br/>");
}
public override void OnActionExecuted(ActionExecutedContext filterContext)
{
filterContext.HttpContext.Response.Write("执行Action之后....<br/>");
}
public override void OnResultExecuting(ResultExecutingContext filterContext)
{
filterContext.HttpContext.Response.Write("呈现View之前....<br/>");
}
public override void OnResultExecuted(ResultExecutedContext filterContext)
{
filterContext.HttpContext.Response.Write("呈现View之后....<br/>");
}
}
同时,我们需要在HomeController的Index方法之上添加这个Filter
[Filter.MyActionFilter]
public ActionResult Index()
{
return View();
}
那么我们来运行一下。看一下结果。

发现的确正如我们所猜测的那样。但是这个例子只是给大家说名一下这个过滤器的四个方法分别是在什么之后执行的。
那么我们就可以利用这个可以实现登录验证的操作,比如我们的每个Action执行之前都需要判断用户有没有登录,如果没有登录那么就让他访问对应的Action。所以这个操作应该是在Action之前要判断的。
我们更改一下MyActionFilterAttribute的方法。
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
if (filterContext.HttpContext.Request.Cookies["user"] == null || filterContext.HttpContext.Request.Cookies["user"].Value == "")
{
filterContext.Result = new RedirectToRouteResult("default", new System.Web.Routing.RouteValueDictionary(new { controller="Login",action="index"}));
}
filterContext.HttpContext.Response.Write("执行Action之前....<br/>");
}
当检查发送过来的请求,如果没有对应的cookie 则我们跳转到登录页面。运行效果如下:

不知道本章大家有没有明白什么是过滤器呢?在以后的知识介绍中,我们还会使用过滤器,这个比较重要哦!好了,本章就到此结束吧!
一步步学习ASP.NET MVC3 (15)——过滤器的更多相关文章
- 一步步学习ASP.NET MVC3 章节总结
请注明转载地址:http://www.cnblogs.com/arhat 对于<一步步学习ASP.NET MVC3>系列工15章,那么为了方便大家能够快速的预览,老魏在这里为这个系列提供一 ...
- 一步步学习ASP.NET MVC3 (1)——基础知识
请注明转载地址:http://www.cnblogs.com/arhat 首先在这里我想声明一下,这个ASP.NET MVC3系列是我在授课过程中的一些经验,有什么不对的地方,请大家指出,我们共同的学 ...
- 一步步学习ASP.NET MVC3 (3)——Razor(1)
请注明转载地址:http://www.cnblogs.com/arhat 首先这个<一步步学习ASP.NET MVC3>前段时间有些忙,没有顾得上写文章,昨天呢写了3个和ASP.NET的相 ...
- 一步步学习ASP.NET MVC3 (12)——FileResult
请注明转载地址:http://www.cnblogs.com/arhat 忙了两天,本来老魏昨天就应该写出新的文章,但是由于昨天雨夹雪而且加上昨天晚上加了班,到家都没饭吃了,一看时间都9点了,什么饭店 ...
- 一步步学习ASP.NET MVC3 (2)——入门程序
请注明转载地址:http://www.cnblogs.com/arhat 在上一节中,我们只是简单的介绍了什么是MVC及MVC的运行原理.而本节呢,主要来实现下一ASP.NET MVC3的开发流程,并 ...
- 一步步学习ASP.NET MVC3 (14)——Route路由
请注明转载地址:http://www.cnblogs.com/arhat 由于今天是星期六,所以多写几篇,感觉前几天的忙碌没有及时发布文章,趁着周末老魏尽力的多写几篇文章.因为本系列基本上快结束了,所 ...
- 一步步学习ASP.NET MVC3 (5)——View从Action中获得数据
请注明转载地址:http://www.cnblogs.com/arhat 在上一章中,我们把Razor的模板技术给大家介绍了一下,当然模板中还有其他的知识点,这个以后我们还会继续讲解.本章我们主要讨论 ...
- 一步步学习ASP.NET MVC3 (6)——@helper,@functions
请注明转载地址:http://www.cnblogs.com/arhat 在前一章中,我们讲述了View如何从Action中获得数据,并显示出来,但随着需求的变化,我们可能要对View中显示的数据作出 ...
- 一步步学习ASP.NET MVC3 (7)——Controller,Action,ActionResult
请注明转载地址:http://www.cnblogs.com/arhat 前面几章我们讲解的都是关于View方面的知识,虽然还有很多关于View的知识没有讲,但是没关系,我们在后面使用到的时候在讲解, ...
随机推荐
- 基于ArcGIS的栅格图像平滑处理(转)
基于ArcGIS的栅格图像平滑处理 栅格数据获取的途径多种多样,造成了栅格数据质量的很大差异,一些质量较差的栅格数据存在大量“噪音”象元,即在表达同类型的地理要素时,出现个别像元值与周边像元不一致的情 ...
- lambda expand in list
[(lambda x: x*x)(x) for x in range(10)] Or better yet: [x*x for x in range(10)]
- Fortify规则与CERT JAVA 安全编程规范的对照表
Fortify规则与CERT JAVA 安全编程规范的对照表http://www.automationqa.com/forum.php?mod=viewthread&tid=4353& ...
- ssh 安全配置
1.只使用ssh v2 //etc/ssh/sshd_cofig Protocol 2 ListenAddress x.x.x.x --如果你的环境有VPN通道,建议sshd监听所在的内网地址: 2 ...
- HTTP层 —— 请求
1.访问请求实例 要通过依赖注入获取当前 HTTP 请求实例,需要在控制器的构造函数或方法中对 Illuminate\Http\Request 类进行类型提示,这样当前请求实例会被服务容器自动注入: ...
- 动态上传多个文件(asp)
CreateElements.html <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" &quo ...
- Submine Text 3 代码自动换行
开启自动换行功能的步骤: 1.打开 Preferences -> Setting - User(设置 - 用户) 2.在再大的括号前添加如下内容即可: "word_wrap" ...
- 编译个性化的openwrt固件
基本流程是:下载openwrt源码(推荐attitude adjustment版本).执行feeds更新.make menuconfig(通过配置feed.conf.default和menuconfi ...
- Java_Web_request.setAttribute("result",username);
request.setAttribute("result",username); 在request对象中加入名为result的属性并附值为username,因为request对象是 ...
- (已实现)相似度到大数据查找之Mysql 文章匹配的一些思路与提高查询速度
需求,最近实现了文章的原创度检测功能,处理思路一是分词之后做搜索引擎匹配飘红,另一方面是量化词组,按文章.段落.句子做数据库查询,功能基本满足实际需求. 接下来,还需要在海量大数据中快速的查找到与一句 ...