MVC初体验-过滤器(10)
2021-04-20 19:28
标签:work end 理解 重写 使用方法 message nbsp control custom 主要有4中过滤器: 1.Authorization 身份验证过滤器 理解身份验证过滤器和无侵入式开发; 假如我这里有学生和教室两个对象,学生进入教室需要进行身份验证,如果在A学生上增加验证,那么在代码层面就构成了侵入式开发,需要修改学生A的代码,如果多了一个学生C,那么又需要继续增加验证代码,不合适; 如果在教室对象上增加身份验证代码,如果新增了教室D,那么身份验证又需要重写,同时也构成了侵入式开发; 所以最好的方案是不修改学生和教室,在它们中间加入一层中间验证,哪个教室需要身份验证,就给它加入一个验证标签即可; 通过特性的方式打标记,决定哪些类或者行为需要进行验证; 特性怎么使用的: 身份验证过滤器怎么写: 如何自定义写过滤器(代码): 1)方法一: ①首先新建一个Filter文件夹(非必须,便于管理),新建一个MyAuthorization类,然后继承AuthorizationAttribute,然后重写OnAuthorization方法; ②应用特性到行为或者控制器; 可以放置过滤特性标签到控制器类上或者行为上。 如何全局注册过滤器,使得所有的控制器,行为都具有过滤特性; 在Global文件中的 FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters); RegisterGlobalFilters中增加下面代码即可 //所有都有了身份验证 2)方法二: 重写控制器的内部OnAuthorization方法,这样会应用过滤于控制器下的所有行为; 缺点:灵活性不够,推荐使用特性的方式,但是这种也可以。 2.异常处理过滤器 怎么做: 首先还是定义一个过滤器的类,该类继承开篇提到的HandleErrorAttribute类,然后类中重写OnException方法; 因为异常过滤器一般会设置在全局环境中,那么在注册过滤器的代码中需要这么样写: 光有了这些还不够,直接执行异常的话会报错,是因为在webconfig中的system.web下增加customErrors标签,并且设置mode属性为On即可; 然后在项目中新建一个Error文件夹,再新建一个400.html文件即可。 同理身份验证,也可以在控制器类中重写OnException方法,然后将该控制器作为自定义基类控制器,让子类的行为都具有异常处理。 3.行为过滤器 还是在Filter文件夹下增加一个MyActionFilter类,然后继承ActionFilterAtterbute,根据需要去重写行为执行前或者行为执行后的 过滤方法即可; 然后按照使用特性的方式去使用行为过滤器; 同理,也可以重写控制器类中OnActionExect[ing/ed] 方法,或者在全局中使用。 4.结果过滤器 同行为过滤器使用方法 总结: End MVC初体验-过滤器(10) 标签:work end 理解 重写 使用方法 message nbsp control custom 原文地址:https://www.cnblogs.com/LeeSki/p/12254869.html 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();
}
}
filters.Add(new MyAuthorization());public class HelloController : Controller
{
// GET: Hello
[MyAuthorization]
public ActionResult Index()
{
return View();
}
//重写此方法即可,在执行顺序上优先调用该验证
protected override void OnAuthorization(AuthorizationContext filterContext)
{
filterContext.HttpContext.Response.Write("Inner Hello!");
}
}
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());
}
}
public class MyActionFilter:ActionFilterAttribute
{
//想在行为执行前就重写行为执行前的方法,反之亦然,不必要两个方法都重写
//行为执行前
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
filterContext.HttpContext.Response.Write("行为执行前:");
}
//行为执行后
public override void OnActionExecuted(ActionExecutedContext filterContext)
{
filterContext.HttpContext.Response.Write("行为执行后!!!!");
}
}
上一篇:css换行