博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
MVC的Filter应用小结
阅读量:5336 次
发布时间:2019-06-15

本文共 4488 字,大约阅读时间需要 14 分钟。

一、概念定义

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);        }    }
View Code

注意:其中 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执行后发生,使用场景:异常处理,页面尾部输出调试信息。

 

转载于:https://www.cnblogs.com/xinaixia/p/4070659.html

你可能感兴趣的文章
[fowarding]Ubuntu jsp平台使用JDBC来连接MySQL数据库
查看>>
JavaScript中的BOM和DOM
查看>>
注册表操作
查看>>
360浏览器兼容模式 不能$.post (不是a 连接 onclick的问题!!)
查看>>
Yii安装使用教程(转)
查看>>
Java四种引用包括强引用,软引用,弱引用,虚引用。
查看>>
spring注入Properties
查看>>
微信小程序开发之从相册获取图片 使用相机拍照 本地图片上传
查看>>
【BZOJ-2295】我爱你啊 暴力
查看>>
【BZOJ-1055】玩具取名 区间DP
查看>>
Bit Twiddling Hacks
查看>>
Windwos中的线程同步
查看>>
LeetCode : Reverse Vowels of a String
查看>>
时间戳与日期的相互转换
查看>>
jmeter(五)创建web测试计划
查看>>
python基本数据类型
查看>>
1305: [CQOI2009]dance跳舞 - BZOJ
查看>>
关于TDD的思考
查看>>
Cocos2d-x学习之windows 7 android环境搭建
查看>>
将html代码中的大写标签转换成小写标签
查看>>