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(); }
此顺序极为重要,也就是所有的过滤器的核心功能。

浙公网安备 33010602011771号