MVC基本类型的过滤器

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

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

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

过滤器类型 接口 默认实现继承类 功能描述
Action IActionFilter ActionFilterAttribute 在动作方法之前及之后运行
Result IResultFilter ActionFilterAttribute 在动作结果被执行之前和之后运行
AuthorizationFilter IAuthorizationFilter AuthorizeAttribute 首先运行,在任何其它过滤器动作方法之前运行
Exception IExceptionFilter HandleErrorAttribute 只在另外一个过滤器,动作方法,动作结果弹出异常时运行

一、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就会跳转到指定错误的页面

猜你喜欢

转载自www.cnblogs.com/live8/p/10203229.html