MVC基本类型的过滤器

过滤器在mvc中发挥着很重要的作用

过滤器(Filters)的出现使得我们可以在ASP.NET MVC程序里更好的控制浏览器请求过来的URL,不是每个请求都会响应内容,只响应特定内容给那些有特定权限的用户,过滤器理论上有以下功能:

判断登录与否或用户权限
决策输出缓存
防盗链
防蜘蛛
本地化与国际化设置
实现动态Action(做权限管理系统的好东西)

 

过滤器类型接口默认实现继承类功能描述
ActionIActionFilterActionFilterAttribute在动作方法之前及之后运行
ResultIResultFilterActionFilterAttribute在动作结果被执行之前和之后运行
AuthorizationFilterIAuthorizationFilterAuthorizeAttribute首先运行,在任何其它过滤器动作方法之前运行
ExceptionIExceptionFilterHandleErrorAttribute只在另外一个过滤器,动作方法,动作结果弹出异常时运行

 

 

一、Action过滤器

       Action过滤器和Result过滤器我在这里是一起添加

首先说一下Action过滤器;主要负责在动作方法之前及之后运行(动作,方法权限)

       1、ActionAttribute过滤器继承ActionFilterAttribute类

       2、ActionAttribute过滤器调用IActionFilter接口

       3、重写OnActionExecuting方法;此方法是在Action动作方法执行前

       4、重写OnActionExecuted方法;此方法是在Action动作方法执行后

Result过滤器;在动作结果被执行之前和之后运行 (结果权限)

       1、ActionAttribute过滤器继承ActionFilterAttribute类(和Action继承成的同一个基类)

       2、ActionAttribute过滤器调用IResultFilter接口

       2、重写OnResultExecuting方法;此方法是在执行操作结果前

       3、重写OnActionExecuted方法;此方法是在执行操作结果前

代码如下:

using System;using System.Collections.Generic;using System.Linq;using System.Web;using System.Web.Mvc;namespace MVCcation.Filters{ //Action在动作方法之前及之后运行 public class ActionAttribute: ActionFilterAttribute, IActionFilter { public override void OnResultExecuting(ResultExecutingContext filterContext) { //base.OnResultExecuting(filterContext); filterContext.HttpContext.Response.Write("在执行操作结果前"); } public override void OnResultExecuted(ResultExecutedContext filterContext) { //base.OnResultExecuted(filterContext); filterContext.HttpContext.Response.Write("在执行操作结果后"); } public override void OnActionExecuting(ActionExecutingContext filterContext) { //base.OnActionExecuting(filterContext); filterContext.HttpContext.Response.Write("在Action方法执行前"); } public override void OnActionExecuted(ActionExecutedContext filterContext) { //base.OnActionExecuted(filterContext); filterContext.HttpContext.Response.Write("在Action方法执行后<br/>"); } }}

接下来就在控制器中过滤器;这里我选择index视图,所以在index控制器上面添加过滤器

using MVCcation.Filters;//引用过滤器文件目录using System;using System.Collections.Generic;using System.Linq;using System.Web;using System.Web.Mvc;namespace MVCcation.Controllers{ public class HomeController : Controller { [Action]//(执行动作和操作)动作处理器 public ActionResult Index() { return View(); } public ActionResult About() { ViewBag.Message = "Your application description page."; return View(); } public ActionResult Contact() { ViewBag.Message = "Your contact page."; return View(); } }}

可以看出Action会在方法执行前后输出,也在Result前面输出

 

二、AuthorizationFilte过滤器

   首先运行,在任何其它过滤器动作方法之前运行(授权限)

       1、AuthorizationFilte过滤器继承AuthorizeAttribute类

       2、AuthorizationFilte过滤器调用IAuthorizationFilter接口

       3、用Request["userType"]是否是vip;如果是测可以访问,否则就跳转到百度

       4、在Index控制器中添加 [AuthorizationFilterAttribute("vip")]//(授权过滤器)只有Vip角色才能进行访问Index视图

using System;using System.Collections.Generic;using System.Linq;using System.Web;using System.Web.Mvc;namespace MVCcation.Filters{ //过滤器一般以Attribute结尾 //[添加注解][过滤器类型] //授权过滤器AuthorizationFilter 继承默认接口AuthorizAttribute public class AuthorizationFilterAttribute: AuthorizeAttribute,IAuthorizationFilter { public AuthorizationFilterAttribute(string usertype) { Roles = usertype; } protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext) { string userType = HttpContext.Current.Request["userType"]; if (userType!="vip") { filterContext.Result = new RedirectResult("http://www.baidu.com"); } else Roles.Contains(userType); //base.HandleUnauthorizedRequest(filterContext); } }}

三、Exception过滤器(异常处理)

   只在另外一个过滤器,动作方法,动作结果弹出异常时运行(异常处理权限)

       1、Exception过滤器继承HandleErrorAttribute类

       2、Exception过滤器调用IExceptionFilter接口

       3、当用户或者访问者访问自身没有权限访问页面,程序会抛出一个错误然后,Exception过滤器处理这个错误后会抛出一个没有权限的提示,这里处理错误我是设置跳转到一个网址

       4、还是在Index视图控制器上添加ExceptionAttribute过滤器

using System;using System.Collections.Generic;using System.Linq;using System.Web;using System.Web.Mvc; namespace MVCcation.Filters{ public class ExceptionAttribute:HandleErrorAttribute { public override void OnException(ExceptionContext filterContext)//发生异常时调用http://www.hermanboke.cn { if (!filterContext.ExceptionHandled) { filterContext.Result = new RedirectResult("http://www.hermanboke.cn");//出现错误后跳转到这个网址 filterContext.ExceptionHandled = true; } base.OnException(filterContext); } }}

这里我们要在Index控制器里面故意抛出一个错误,来让Exception过滤器处理

 throw new DllNotFoundException();//抛出一个异常

 [AuthorizationFilterAttribute("vip")]//(授权过滤器)只有Vip角色才能进行访问Index视图 [Action]//(执行动作和操作)动作处理器 [Exception]//(错误日志处理器) public ActionResult Index() { throw new DllNotFoundException();//抛出一个异常 return View(); }

然后运行index视图;在浏览器中输入http://localhost:50003/Home/Index?userType=vip就会跳转到指定错误的页面

相关文章