MVC 身份验证和异常处理过滤器

两种使用方式:
1自定义类继承自相应的类或接口,重写方法,作为特性使用
2 在控制器类中重写方法

特性方式的使用
注意:如果继承自接口需要让类实现FilterAttribute,才可以作为特性使用
使用方式1:作为ControllerAction的特性
使用方式2:在Global中注册为全局过滤器,应用于所有的ControllerAction
参数类均继承自ControllerContext,主要包含属性请求上下文、路由数据、结果

using FilterExam.Fiter;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;


namespace FilterExam.Controllers
{
    public class HomeController : Controller
    {
        //[MyAuthorization]//第一种方式
        // GET: Home
        public ActionResult Index()
        {
            throw new Exception();//调用异常验证过滤器
            return View();
        }


        public ActionResult Show()
        {
            return View();
        }

//第二种方式
        protected override void OnAuthorization(AuthorizationContext filterContext)
        {
            filterContext.HttpContext.Response.Write("456");
        }

    }
}


//身份验证过滤器

在约束的Action执行前执行
重写OnAuthorization方法
如果不想使用默认的身份验证方式,需要将base.***删除
如果想进行跳转,需要设置上下文对象的Result属性为new RedirectResult(string url);

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;


namespace FilterExam.Fiter
{
    public class MyAuthorization:AuthorizeAttribute
    {
        public override void OnAuthorization(AuthorizationContext filterContext)
        {


           // filterContext.Result = new RedirectResult(UrlHelper.GenerateUrl("", "Loin", "UserInfo", null, null, null, false));


            filterContext.HttpContext.Response.Write("123");
        }
    }

}

//异常验证过滤器

当发生异常时,用于进行自定义异步处理,如记录日志、跳转页面
使用自定义异常处理,需要在web.config中为system.web添加<customErrors mode="On" />节点
重写OnException方法,不要禁用base.***
如果想进行跳转,需要设置上下文对象的Result属性为new RedirectResult(string url);

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;


namespace FilterExam.Fiter
{
    public class MyException:HandleErrorAttribute
    {
        public override void OnException(ExceptionContext filterContext)
        {
            base.OnException(filterContext);
            filterContext.Result = new RedirectResult("/Error/400.html");
        }
    }

}

//FilterConfig

using FilterExam.Fiter;
using System.Web;
using System.Web.Mvc;


namespace FilterExam
{
    public class FilterConfig
    {
        public static void RegisterGlobalFilters(GlobalFilterCollection filters)
        {
            //filters.Add(new HandleErrorAttribute());
            //filters.Add(new MyAuthorization());
            filters.Add(new MyException());
        }
    }

}


<system.web>
    <customErrors mode="On"></customErrors>
    <authentication mode="None" />
    <compilation debug="true" targetFramework="4.5.2" />
    <httpRuntime targetFramework="4.5.2" />
  </system.web>

原文地址:https://www.cnblogs.com/dxmfans/p/9434746.html