mvc 4种 过滤器

mvc的4种过滤器

自定义过滤器的话,有2种方式,一:自定义类,继承相应的过滤器,然后以特性的方式对action,或者controller 进行控制,如果想对所有的controller,即所有的请求进行过滤的话可以在global里进行注册。也就是appstart文件夹下的FilterConfig里。二:继承controller,然后重写过滤方法,然后让controller继承自定义的实现过滤的类。

 

身份验证过滤器:

 

    public class MyAuthorization : AuthorizeAttribute
    {
        public override void OnAuthorization(AuthorizationContext filterContext)
        {
            filterContext.Result = new RedirectResult("/home/show");
            //之所以不用平时的重定向是因为,客户端虽然跳转了,但是服务端会继续执行相应的action
            // filterContext.HttpContext.Response.Redirect("");
        }
    }

其实对于身份验证过滤器来说,其重载方法除了上面那个以外,还有另外2个,举个例子

 

       protected override bool AuthorizeCore(System.Web.HttpContextBase httpContext)
        {
            //是否登录以及登录信息是否有效
            if (!AuthenContext.Current.IsLogin)
            {
                status = AuthorizeStatus.NeedLogin;
                return false;
            }

            return true;
        }

        protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext)
        {
            string redirectUrl = FormsAuthentication.LoginUrl + "?status=" + status;
            if (!String.IsNullOrEmpty(filterContext.HttpContext.Request.Url.OriginalString))
                redirectUrl += "&redirectUri=" + HttpUtility.UrlEncode(filterContext.HttpContext.Request.Url.OriginalString);

            filterContext.Result = new RedirectResult(redirectUrl);
        }

这2个就比较有意思了,对于第一个返回的bool值来判断第二个是否执行。

 

异常过滤器:

 

    public class MyException : HandleErrorAttribute
    {
        public override void OnException(ExceptionContext filterContext)
        {
            //不可以被删除
            base.OnException(filterContext);
            filterContext.Result = new RedirectResult("/error/error.html");
        }
    }

一定不能删除那句话,然后去FilterConfig里,干掉默认的异常处理方式,然后实例化咱自定义的那种。

       public static void RegisterGlobalFilters(GlobalFilterCollection filters)
        {
          //  filters.Add(new HandleErrorAttribute());
            filters.Add(new MyException());
        }

然后去webconfig里启用错误处理功能,就完事了。对于错误页面,则是随意找个地方就可以了,好像不遵循路由规则。

<system.web>
    <customErrors mode="On"></customErrors>

 

剩下的2中过滤器,都是继承自一个 ActionFilterAttribute的,所以就一起说了,其实很简单,就是action执行前后可以做的操作,result执行前后可以做的操作,

我觉得最主要的就是要注意过滤器的执行机制,到底是什么时候执行的,顺道验证一下验证过滤器是最先执行的,所以,来了一个相对完整,但是极其简单的测试哈

 

public class MyAuthorization : AuthorizeAttribute
    {
        public override void OnAuthorization(AuthorizationContext filterContext)
        {
            filterContext.HttpContext.Response.Write("我是身份验证的<br><br>");
         //   filterContext.Result = new RedirectResult("/home/show");
            //之所以不用平时的重定向是因为,客户端虽然跳转了,但是服务端会继续执行相应的action
            // filterContext.HttpContext.Response.Redirect("");
        }
    }

 

public class MyAction:ActionFilterAttribute
    {
        public override void OnActionExecuting(ActionExecutingContext filterContext)
        {
            filterContext.HttpContext.Response.Write("动作执行前<br><br>");
        }

        public override void OnActionExecuted(ActionExecutedContext filterContext)
        {
            filterContext.HttpContext.Response.Write("动作执行后<br><br>");
        }

        public override void OnResultExecuting(ResultExecutingContext filterContext)
        {
            filterContext.HttpContext.Response.Write("返回结果执行前<br><br>");
        }

        public override void OnResultExecuted(ResultExecutedContext filterContext)
        {
            filterContext.HttpContext.Response.Write("返回结果执行后<br><br>");
        }
    }

 

    [MyAuthorization]
        [MyAction]
        public ActionResult Index()
        {
            Response.Write("我是专门用于验证action执行前后状态的<br><br>");
           

            return View();
        }

 

此顺序极为重要,也就是所有的过滤器的核心功能。

 

posted on 2018-01-07 17:06  奔游浪子  阅读(368)  评论(0)    收藏  举报

导航