主要有4中过滤器:
1.Authorization 身份验证过滤器
理解身份验证过滤器和无侵入式开发;
假如我这里有学生和教室两个对象,学生进入教室需要进行身份验证,如果在A学生上增加验证,那么在代码层面就构成了侵入式开发,需要修改学生A的代码,如果多了一个学生C,那么又需要继续增加验证代码,不合适;
如果在教室对象上增加身份验证代码,如果新增了教室D,那么身份验证又需要重写,同时也构成了侵入式开发;
所以最好的方案是不修改学生和教室,在它们中间加入一层中间验证,哪个教室需要身份验证,就给它加入一个验证标签即可;
通过特性的方式打标记,决定哪些类或者行为需要进行验证;
特性怎么使用的:
身份验证过滤器怎么写:
如何自定义写过滤器(代码):
1)方法一:
①首先新建一个Filter文件夹(非必须,便于管理),新建一个MyAuthorization类,然后继承AuthorizationAttribute,然后重写OnAuthorization方法;
public class MyAuthorization:AuthorizeAttribute { public override void OnAuthorization(AuthorizationContext filterContext) { //如果保留如下代码,则会运行.net framework定义好的身份验证,如果需要使用自定义身份验证,则禁用下列代码 //base.OnAuthorization(filterContext); //获取Http上下文内容 filterContext.HttpContext.Response.Write("123456"); //如果需要实现页面跳转功能,需要使用Result,而不是使用Respon.Redirect(), //因为第二种方案服务端的代码仍然会继续往下执行,不会停止 //filterContext.Result = new RedirectResult("controller/action"); } }
②应用特性到行为或者控制器;
[MyAuthorization] public class HomeController : Controller { [MyAuthorization] 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(); } }
可以放置过滤特性标签到控制器类上或者行为上。
如何全局注册过滤器,使得所有的控制器,行为都具有过滤特性;
在Global文件中的
FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
RegisterGlobalFilters中增加下面代码即可
//所有都有了身份验证
filters.Add(new MyAuthorization());
2)方法二:
重写控制器的内部OnAuthorization方法,这样会应用过滤于控制器下的所有行为;
public class HelloController : Controller { // GET: Hello [MyAuthorization] public ActionResult Index() { return View(); } //重写此方法即可,在执行顺序上优先调用该验证 protected override void OnAuthorization(AuthorizationContext filterContext) { filterContext.HttpContext.Response.Write("Inner Hello!"); } }
缺点:灵活性不够,推荐使用特性的方式,但是这种也可以。
2.异常处理过滤器
怎么做:
首先还是定义一个过滤器的类,该类继承开篇提到的HandleErrorAttribute类,然后类中重写OnException方法;
public class MyException:HandleErrorAttribute { public override void OnException(ExceptionContext filterContext) { //如下代码不可删除,否则将无法捕获到异常 base.OnException(filterContext); //记录日志 //页面跳转 filterContext.Result = new RedirectResult(@"/Error/400.html"); } }
因为异常过滤器一般会设置在全局环境中,那么在注册过滤器的代码中需要这么样写:
public class FilterConfig { public static void RegisterGlobalFilters(GlobalFilterCollection filters) { //系统默认的异常处理过滤器,如果使用自定义异常处理,要禁用如下代码 //filters.Add(new HandleErrorAttribute()); //异常捕获 filters.Add(new MyException()); //所有都有了身份验证 filters.Add(new MyAuthorization()); } }
光有了这些还不够,直接执行异常的话会报错,是因为在webconfig中的system.web下增加customErrors标签,并且设置mode属性为On即可;
<system.web> <customErrors mode="On"></customErrors> <compilation debug="true" targetFramework="4.5"/> <httpRuntime targetFramework="4.5"/> </system.web>
然后在项目中新建一个Error文件夹,再新建一个400.html文件即可。
同理身份验证,也可以在控制器类中重写OnException方法,然后将该控制器作为自定义基类控制器,让子类的行为都具有异常处理。
3.行为过滤器
还是在Filter文件夹下增加一个MyActionFilter类,然后继承ActionFilterAtterbute,根据需要去重写行为执行前或者行为执行后的 过滤方法即可;
public class MyActionFilter:ActionFilterAttribute { //想在行为执行前就重写行为执行前的方法,反之亦然,不必要两个方法都重写 //行为执行前 public override void OnActionExecuting(ActionExecutingContext filterContext) { filterContext.HttpContext.Response.Write("行为执行前:"); } //行为执行后 public override void OnActionExecuted(ActionExecutedContext filterContext) { filterContext.HttpContext.Response.Write("行为执行后!!!!"); } }
然后按照使用特性的方式去使用行为过滤器;
同理,也可以重写控制器类中OnActionExect[ing/ed] 方法,或者在全局中使用。
4.结果过滤器
同行为过滤器使用方法
总结:
End
原文地址:https://www.cnblogs.com/LeeSki/p/12254869.html