过滤器(Filter)把附加逻辑注入到MVC框架的请求处理。实现了交叉关注。
交叉关注:用于整个应用程序,又不适合放在某个局部位置的功能。
过滤器是.NET的注解属性(Attribute),它们对请求处理管道添加了额外的步骤。
注解属性是派生于System.Attribute的特殊的.NET类。
可以被附加到类、方法、属性、字段等代码元素上。其目的是把附加信息嵌入到已编译的代码中,以便在运行时读回这些信息。
过滤器的基本类型:
过滤器类型 接口 默认实现 描述 Authorization IAuthorizationFilter AuthorizationAttribute 最先运行 Action IActionFilter ActionFilterAttribute 在动作方法前后运行 Result IResultFilter ActionResultAttribute 在动作结果被执行前后 Exception IExceptionFilter HandlerErrorAttribute 仅在过滤器、动作发生异常时
授权过滤器:IAuthorizationFilter
namespace System.Web.Mvc{ // 摘要:定义授权筛选器所需的方法。 public interface IAuthorizationFilter{ // 摘要:在需要授权时调用。 // 参数:filterContext:筛选器上下文。 void OnAuthorization(AuthorizationContext filterContext); } }
注意:
直接实现接口其实是一件非常危险的事;因此创建一个自定义AuthorizeAttribute子类,再实现授权代码比较容易。
public class CustomAuthAttribute:AuthorizeAttribute{ /// <summary> /// 是否对请求进行授权访问的方式 /// </summary> /// <param>对请求信息进行访问的方法</param> protected override bool AuthorizeCore(HttpContextBase httpContext){ return base.AuthorizeCore(httpContext); } }
直接实现IAuthorizationFilter接口的主要原因是为了获取对传递给OnAuthorization()的AuthorizationContext的访问,通过它可以获得更广泛的信息(路由细节、当前控制器和动作方法信息)。使用接口的方式不仅有安全风险且让授权注解属性中建立的逻辑与控制器紧密的耦合在一起,破坏关注分离,不便于维护。
内建的授权过滤器:
虽然使用了AuthorizeAttribute类作为自定义过滤器的基础,但其AuthorizeCore()有自己的实现
当直接使用AuthorizeAttribute时,可以使用它的public属性来指定授权策略
AuthorizeAttribute属性
名称 类型 描述 Users String 一个逗号分隔的用户名列表,指定这些用户可以访问动作方法 Roles String 一个逗号分隔的角色列表,用户必须至少有一个角色
public class HomeController : Controller{ [Authorize(Users ="admin,steve,jacqui",Roles ="admin")] public ActionResult Index(){ return View(); } }
异常过滤器:
namespace System.Web.Mvc{ // 摘要:定义异常筛选器所需的方法。 public interface IExceptionFilter{ // 摘要:在发生异常时调用。 // 参数:filterContext: // 筛选器上下文。 void OnException(ExceptionContext filterContext); } }
当一个未处理的异常出现时,OnException()被调用。该方法的参数是一个ExceptionContext 对象,此对象派生于ControllerContext,并提供了许多有用的属性。
名称 类型 描述 Controller ControllerBase 返回请求的控制器对象 HttpContext HttpContextBase 提供对请求细节的访问及对响应的访问 IsChildAction Bool 若是自动做则返回true RequestContext RequestContext 提供对HttpContext和路由数据的访问 RouteData RouteData 返回请求的路由数据
继承自ControllerContext的属性
名称 类型 描述 ActionDescripter ActionDescripter 提供动作方法的细节 Result ActionResult 用于动作方法的结果,通过非空值可取消请求 Exception Exception 未处理的异常 ExceptionHandled Bool 如果另一个过滤器已经把这个异常标记为已处理则返回true
实现自定义异常过滤器
public class RangeExceptionAttribute : FilterAttribute, IExceptionFilter{ public void OnException(ExceptionContext filterContext){ } }
使用内建的异常过滤器:
HandleErrorAttribute属性
名称 类型 描述 ExceptionType Type 由过滤器处理的异常类型 View String 该过滤器渲染的视图模板名 Master String 在渲染这个过滤器的视图时使用的布局名称
准备工作:
在web.config文件中启用自定义错误时,HandleErrorAttribute过滤器才会生效,在<system.web>节点中添加一个customErrors属性即可;
<system.web> <!--定制错误页aa.html--> <customErrors mode="On" defaultRedirect="/Content/aa.html" /> </system.web>