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是一种声明式编 ...
随机推荐
- 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 ...
- bio、nio、aio及select、poll、epoll
BIO与NIO.AIO的区别http://blog.csdn.net/skiof007/article/details/52873421 select.poll.epoll之间的区别总结http:// ...
- PHP常量定义之define与const对比
简要归纳PHP中两个常量定义关键字的区别: 1.define是函数,const是语言结构,PHP编译时const速度快.2.define只能用在类外,const类内类外皆可.3.define定义的常量 ...
- PowerDesigner关系线显示名称
选中关联关系线,右击选择“格式”,打开如下窗口,将“Name” 选项进行勾选上即可. 参考: http://loginleft.iteye.com/blog/2400980
- springboot-线程池简单使用
最近做项目,关于订单创建时候因为需要调用远程http服务获取数据,然后校验并写入数据库和修改数据库, 导致接口效率低,所以想到实现异步操作的方式解决. 在调用远程接口成功的时候即认为接口处理成功,返回 ...
- servlet 3.0特性说明
Servlet 3.0 作为 Java EE 6 规范体系中一员,随着 Java EE 6 规范一起发布.该版本在前一版本(Servlet 2.5)的基础上提供了若干新特性用于简化 Web 应用的开发 ...
- GIF图片合集(用于网络请求图片用)
GIF图片合集(用于网络请求图片用)
- java获取http请求的Header和Body
在http请求中,有Header和Body之分,读取header使用request.getHeader("..."); 读取Body使用request.getReader(),但g ...
- QT vs x64编译
下载qt-everywhere-opensource-src-5.3.0 这个设置非常重要,不对的话,一大堆编译错误,已经折腾了好多回了 configure -mp -confirm-license ...
- R语言缺点
R的优点:免费,开源,体积小.缺点:对大文本处理差,另外一个也在于开源,package如果出错,烦死你.当你跑比较大的simulation,对效率有要求的时候,有时还是不得不用C,这可能是10小时和1 ...