一、概念定义

Filter是一种声明式编程方式,在Asp.net MVC中它只能限制于Action(或它的Controller)。

Filter用途广泛:(1)判断登录与否或用户权限;(2)决策输出缓存;(3)防盗链;(4)防蜘蛛;(5)本地化与国际化设置(6)实现动态Action。

Filter要继承于ActionFilterAttribute抽象类,并覆写四个方法:

(1)OnActionExecuting是Action执行前的操作;(2)OnActionExecuted则是Action执行后的操作;

(3)OnResultExecuting是解析ActionResult前执行;(4)OnResultExecuted是解析ActionResult后执行。

二、创建filter类:类需要继承一个接口,并且重写4个方法

public class paramFilter : System.Web.Mvc.ActionFilterAttribute
{
//Action执行前的操作
public override void OnActionExecuting(System.Web.Mvc.ActionExecutingContext filterContext)
{
if (filterContext.HttpContext.Request.QueryString["k"] == "go")
{
string retUrl = filterContext.RouteData.GetRequiredString("controller") + "/" + filterContext.RouteData.GetRequiredString("action");
filterContext.HttpContext.Response.Redirect("http://" + filterContext.HttpContext.Request.Url.Host + ":" + filterContext.HttpContext.Request.Url.Port.ToString() + "/" + retUrl);
}
} //Action执行后的操作
public override void OnActionExecuted(System.Web.Mvc.ActionExecutedContext filterContext)
{
base.OnActionExecuted(filterContext);
} //解析ActionResult前执行
public override void OnResultExecuting(System.Web.Mvc.ResultExecutingContext filterContext)
{
base.OnResultExecuting(filterContext);
} //解析ActionResult后执行
public override void OnResultExecuted(System.Web.Mvc.ResultExecutedContext filterContext)
{
base.OnResultExecuted(filterContext);
}
}

注意:其中 filterContext对象是从页面传过来的。

其中ActionExecutingContext类其属性如下表:

ActionDescriptor 获取或设置操作描述符。
ActionParameters 获取或设置操作方法参数。
Controller 获取或设置控制器。 (从 ControllerContext继承。)
DisplayMode 获取显示模式。 (从 ControllerContext继承。)
HttpContext 获取或设置 HTTP 上下文。 (从 ControllerContext继承。)
IsChildAction 获取一个值,该值指示关联的操作方法是否为子操作。 (从 ControllerContext继承。)
ParentActionViewContext 获取一个对象,该对象包含父操作方法的视图上下文信息。 (从 ControllerContext继承。)
RequestContext 获取或设置请求上下文。 (从 ControllerContext继承。)
Result 获取或设置由操作方法返回的结果。
RouteData 获取或设置 URL 路由数据。 (从 ControllerContext继承。)

获取页面controller值:filterContext.RouteData.GetRequiredString("controller")
获取页面action值:filterContext.RouteData.GetRequiredString("action")
其他页跳转面:filterContext.HttpContext.Response.Redirect()
获取ip地址:filterContext.HttpContext.Request.Url.Host 
获取端口:filterContext.HttpContext.Request.Url.Port.ToString()

三、Filter应用在Controller上的使用方式

1、直接将Filter应用在Controller上,如:

[paramFilter]
public class UserController : Controller{}

2、重写Controller内的 OnActionExecuting/OnActionExecuted/OnResultExecuting/OnResultExecuted的四个方法。

四、以下为几个系统的Filter。

1、AcceptVerbs:规定页面的访问形式

[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Example(){ return View(); }

2、ActionName:规定Action的名称。

应用场景:如果不想用方法名做为Action名,或Action名为关键字的话,如
[ActionName("UserLog")]
public ActionResult Login(){ return View(); }

3、NonAction:当前方法仅是普通方法不解析为Action。

4、ValidateInput:该Action可以接受Html等危险代码(ASP.NET MVC在aspx中设置<%@ Page 的属性无法完成等同任务)

[ValidateInput(false)]
public ActionResult List() { return View(); }

5、ValidateAntiForgeryTokenAttribute:用于验证服务器篡改。

[ValidateAntiForgeryToken]
public ActionResult UserAdd() { return View(); }

五、Filter的集中应用场景介绍

1、使用场景:验证登录等。

public class LoginFilterAttribute:ActionFilterAttribute
{
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
//当用户没有验证时
if (!filterContext.HttpContext.User.Identity.IsAuthenticated)
{ filterContext.Result = new RedirectToRouteResult("Default",
new RouteValueDictionary(new {action="Login"})
);
}
}
}

[LoginFilterAttribute]

public ActionResult Index()

2、使用场景:异常处理

public class ErrorActionFilter:ActionFilterAttribute
{
public override void OnActionExecuted(ActionExecutedContext filterContext)
{
if (filterContext.Exception != null)
{
filterContext.Canceled = true;
filterContext.Result = new RedirectToRouteResult("Demo", new RouteValueDictionary(new { action = "ErrorPage" }));
}
}
} [ErrorActionFilter]
public void ErrorHandler() { throw new Exception(); }

3、OnResultExecuting:在result执行前发生(在view 呈现前);使用场景:设置客户端缓存,服务器端压缩。

4、OnResultExecuted:在result执行后发生,使用场景:异常处理,页面尾部输出调试信息。

MVC的Filter应用小结的更多相关文章

  1. MVC数据验证使用小结

    原文:MVC数据验证使用小结 描述:MVC数据验证使用小结 内容:display,Required,stringLength,Remote,compare,RegularExpression 本人最近 ...

  2. 反爬虫:利用ASP.NET MVC的Filter和缓存(入坑出坑) C#中缓存的使用 C#操作redis WPF 控件库——可拖动选项卡的TabControl 【Bootstrap系列】详解Bootstrap-table AutoFac event 和delegate的分别 常见的异步方式async 和 await C# Task用法 c#源码的执行过程

    反爬虫:利用ASP.NET MVC的Filter和缓存(入坑出坑)   背景介绍: 为了平衡社区成员的贡献和索取,一起帮引入了帮帮币.当用户积分(帮帮点)达到一定数额之后,就会“掉落”一定数量的“帮帮 ...

  3. ASP.NET没有魔法——ASP.NET MVC 过滤器(Filter)

    上一篇文章介绍了使用Authorize特性实现了ASP.NET MVC中针对Controller或者Action的授权功能,实际上这个特性是MVC功能的一部分,被称为过滤器(Filter),它是一种面 ...

  4. Asp.net mvc自定义Filter简单使用

    自定义Filter的基本思路是继承基类ActionFilterAttribute,并根据实际需要重写OnActionExecuting,OnActionExecuted,OnResultExecuti ...

  5. Asp.net MVC使用Filter解除Session, Cookie等依赖

    本文,介绍了Filter在MVC请求的生命周期中的作用和角色,以及Filter的一些常用应用场景. 同时针对MVC中的对于Session,Cookie等的依赖,如何使用Filter解依赖. 如果大家有 ...

  6. [转]Asp.net MVC使用Filter解除Session, Cookie等依赖

    本文转自:http://www.cnblogs.com/JustRun1983/p/3279139.html 本文,介绍了Filter在MVC请求的生命周期中的作用和角色,以及Filter的一些常用应 ...

  7. [asp.net mvc]自定义filter

    写在前面 最近在摸索mvc,在app中的webview中嵌入h5应用,经常需要用到对cookie的读取操作.所以想到通过自定义的filter截取cookie,然后通过在action上面打特性的方式针对 ...

  8. MVC Action Filter

    ASP.NET MVC Framework支持四种不同类型的Filter: Authorization filters – 实现IAuthorizationFilter接口的属性. Action fi ...

  9. ASP.NET MVC 过滤器Filter

    在Asp.netMvc中当你有以下及类似以下需求时你可以使用Filter功能 判断登录与否或用户权限 决策输出缓存 防盗链 防蜘蛛 本地化与国际化设置 实现动态Action Filter是一种声明式编 ...

随机推荐

  1. Codeforces Round #295 (Div. 2)A - Pangram 水题

    A. Pangram time limit per test 2 seconds memory limit per test 256 megabytes input standard input ou ...

  2. bio、nio、aio及select、poll、epoll

    BIO与NIO.AIO的区别http://blog.csdn.net/skiof007/article/details/52873421 select.poll.epoll之间的区别总结http:// ...

  3. PHP常量定义之define与const对比

    简要归纳PHP中两个常量定义关键字的区别: 1.define是函数,const是语言结构,PHP编译时const速度快.2.define只能用在类外,const类内类外皆可.3.define定义的常量 ...

  4. PowerDesigner关系线显示名称

    选中关联关系线,右击选择“格式”,打开如下窗口,将“Name” 选项进行勾选上即可. 参考: http://loginleft.iteye.com/blog/2400980

  5. springboot-线程池简单使用

    最近做项目,关于订单创建时候因为需要调用远程http服务获取数据,然后校验并写入数据库和修改数据库, 导致接口效率低,所以想到实现异步操作的方式解决. 在调用远程接口成功的时候即认为接口处理成功,返回 ...

  6. servlet 3.0特性说明

    Servlet 3.0 作为 Java EE 6 规范体系中一员,随着 Java EE 6 规范一起发布.该版本在前一版本(Servlet 2.5)的基础上提供了若干新特性用于简化 Web 应用的开发 ...

  7. GIF图片合集(用于网络请求图片用)

    GIF图片合集(用于网络请求图片用)

  8. java获取http请求的Header和Body

    在http请求中,有Header和Body之分,读取header使用request.getHeader("..."); 读取Body使用request.getReader(),但g ...

  9. QT vs x64编译

    下载qt-everywhere-opensource-src-5.3.0 这个设置非常重要,不对的话,一大堆编译错误,已经折腾了好多回了 configure -mp -confirm-license ...

  10. R语言缺点

    R的优点:免费,开源,体积小.缺点:对大文本处理差,另外一个也在于开源,package如果出错,烦死你.当你跑比较大的simulation,对效率有要求的时候,有时还是不得不用C,这可能是10小时和1 ...