MVC的Filter应用小结
一、概念定义
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应用小结的更多相关文章
- MVC数据验证使用小结
原文:MVC数据验证使用小结 描述:MVC数据验证使用小结 内容:display,Required,stringLength,Remote,compare,RegularExpression 本人最近 ...
- 反爬虫:利用ASP.NET MVC的Filter和缓存(入坑出坑) C#中缓存的使用 C#操作redis WPF 控件库——可拖动选项卡的TabControl 【Bootstrap系列】详解Bootstrap-table AutoFac event 和delegate的分别 常见的异步方式async 和 await C# Task用法 c#源码的执行过程
反爬虫:利用ASP.NET MVC的Filter和缓存(入坑出坑) 背景介绍: 为了平衡社区成员的贡献和索取,一起帮引入了帮帮币.当用户积分(帮帮点)达到一定数额之后,就会“掉落”一定数量的“帮帮 ...
- ASP.NET没有魔法——ASP.NET MVC 过滤器(Filter)
上一篇文章介绍了使用Authorize特性实现了ASP.NET MVC中针对Controller或者Action的授权功能,实际上这个特性是MVC功能的一部分,被称为过滤器(Filter),它是一种面 ...
- Asp.net mvc自定义Filter简单使用
自定义Filter的基本思路是继承基类ActionFilterAttribute,并根据实际需要重写OnActionExecuting,OnActionExecuted,OnResultExecuti ...
- Asp.net MVC使用Filter解除Session, Cookie等依赖
本文,介绍了Filter在MVC请求的生命周期中的作用和角色,以及Filter的一些常用应用场景. 同时针对MVC中的对于Session,Cookie等的依赖,如何使用Filter解依赖. 如果大家有 ...
- [转]Asp.net MVC使用Filter解除Session, Cookie等依赖
本文转自:http://www.cnblogs.com/JustRun1983/p/3279139.html 本文,介绍了Filter在MVC请求的生命周期中的作用和角色,以及Filter的一些常用应 ...
- [asp.net mvc]自定义filter
写在前面 最近在摸索mvc,在app中的webview中嵌入h5应用,经常需要用到对cookie的读取操作.所以想到通过自定义的filter截取cookie,然后通过在action上面打特性的方式针对 ...
- MVC Action Filter
ASP.NET MVC Framework支持四种不同类型的Filter: Authorization filters – 实现IAuthorizationFilter接口的属性. Action fi ...
- ASP.NET MVC 过滤器Filter
在Asp.netMvc中当你有以下及类似以下需求时你可以使用Filter功能 判断登录与否或用户权限 决策输出缓存 防盗链 防蜘蛛 本地化与国际化设置 实现动态Action Filter是一种声明式编 ...
随机推荐
- python开发_xml.etree.ElementTree_XML文件操作_该模块在操作XML数据是存在安全隐患_慎用
xml.etree.ElementTree模块实现了一个简单而有效的用户解析和创建XML数据的API. 在python3.3版本中,该模块进行了一些修改: xml.etree.cElementTree ...
- Xcode更新后插件失效解决办法
defaults read /Applications/Xcode.app/Contents/Info DVTPlugInCompatibilityUUID 获取新版xcode的uuid Xcode6 ...
- C#高级编程9-第5章 泛型
泛型 1.泛型概述 泛型是C#的部分与中间语言IL集成.创建的类或方法指定了类型,在实例化和调用时必须指定类型进行操作. 泛型可以用于类.方法.接口和委托以及结构. 泛型也是结构,同时是运行库CLR定 ...
- js异步任务处理方式
一.es6(es2015)之前:使用原始的callback函数,会陷入回掉地域 this.$http.jsonp('/login', (res) => { this.$http.jsonp('/ ...
- Tomcat篇
安装tomcat 先从tomcat官网找到最新的版本下载地址,我找的是Core下的安装包,下载到本地: wget http://mirror.bit.edu.cn/apache/tomcat/tomc ...
- 2007 Audi A4 INSTRUMENT CLUSTER WIRING DIAGRAM
BOSCH RB8 8E0920 951G I found the answer by myself...... Here is what it's work for me. GREEN CONNEC ...
- jquery实现回车键触发事件
键盘事件有3: keydown,keypress,keyup,分别是按下,按着没上抬,上抬键盘 . 正确代码为: $(document).keyup(function(event){ if(event ...
- Python基础教程学习(三)
如何定义类 class ClassName(base_class[es]): "optional documentation string" static_member_decla ...
- java多台
多 态★★★★★(面向对象特征之一):函数本身就具备多态性,某一种事物有不同的具体的体现. 体现:父类引用或者接口的引用指向了自己的子类对象.//Animal a = new Cat();父类可以调用 ...
- html圆形头像的制作
<html> <head><title>圆形头像的制作</title> <style type="text/css">. ...