ASP.NET mvc4中的过滤器的使用
mvc4中的过滤器
过滤器(Filter)把附加逻辑注入到MVC框架的请求处理。实现了交叉关注。
交叉关注:用于整个应用程序,又不适合放在某个局部位置的功能。
过滤器是.NET的注解属性(Attribute),它们对请求处理管道添加了额外的步骤。
注解属性是派生于System.Attribute的特殊的.NET类。
可以被附加到类、方法、属性、字段等代码元素上。其目的是把附加信息嵌入到已编译的代码中,以便在运行时读回这些信息。
过滤器的基本类型:
过滤器类型 接口 默认实现 描述 Authorization IAuthorizationFilter AuthorizationAttribute 最先运行 Action IActionFilter ActionFilterAttribute 在动作方法前后运行 Result IResultFilter ActionResultAttribute 在动作结果被执行前后 Exception IExceptionFilter HandlerErrorAttribute 仅在过滤器、动作发生异常时
授权过滤器:IAuthorizationFilter
namespaceSystem.Web.Mvc{ //摘要:定义授权筛选器所需的方法。 publicinterfaceIAuthorizationFilter{ //摘要:在需要授权时调用。 //参数:filterContext:筛选器上下文。 voidOnAuthorization(AuthorizationContextfilterContext); } }
注意:
直接实现接口其实是一件非常危险的事;因此创建一个自定义AuthorizeAttribute子类,再实现授权代码比较容易。
publicclassCustomAuthAttribute:AuthorizeAttribute{ //////是否对请求进行授权访问的方式 /// ///对请求信息进行访问的方法 protectedoverrideboolAuthorizeCore(HttpContextBasehttpContext){ returnbase.AuthorizeCore(httpContext); } }
直接实现IAuthorizationFilter接口的主要原因是为了获取对传递给OnAuthorization()的AuthorizationContext的访问,通过它可以获得更广泛的信息(路由细节、当前控制器和动作方法信息)。使用接口的方式不仅有安全风险且让授权注解属性中建立的逻辑与控制器紧密的耦合在一起,破坏关注分离,不便于维护。
内建的授权过滤器:
虽然使用了AuthorizeAttribute类作为自定义过滤器的基础,但其AuthorizeCore()有自己的实现
当直接使用AuthorizeAttribute时,可以使用它的public属性来指定授权策略
AuthorizeAttribute属性
名称 类型 描述 Users String 一个逗号分隔的用户名列表,指定这些用户可以访问动作方法 Roles String 一个逗号分隔的角色列表,用户必须至少有一个角色
publicclassHomeController:Controller{ [Authorize(Users="admin,steve,jacqui",Roles="admin")] publicActionResultIndex(){ returnView(); } }
异常过滤器:
namespaceSystem.Web.Mvc{ //摘要:定义异常筛选器所需的方法。 publicinterfaceIExceptionFilter{ //摘要:在发生异常时调用。 //参数:filterContext: //筛选器上下文。 voidOnException(ExceptionContextfilterContext); } }
当一个未处理的异常出现时,OnException()被调用。该方法的参数是一个ExceptionContext对象,此对象派生于ControllerContext,并提供了许多有用的属性。
继承自ControllerContext的属性
实现自定义异常过滤器
publicclassRangeExceptionAttribute:FilterAttribute,IExceptionFilter{ publicvoidOnException(ExceptionContextfilterContext){ } }
使用内建的异常过滤器:
HandleErrorAttribute属性
准备工作:
在web.config文件中启用自定义错误时,HandleErrorAttribute过滤器才会生效,在
Mode属性的默认值是RemoteOnly在开发期间,HandleErrorAttribute将不会拦截异常,但当应用程序部署到产品服务器时,并从另一台计算机发出请求时HandleErrorAttribute变生效
[HandleError(ExceptionType=typeof(ArgumentNullException),View="Null")] publicActionResultIndex(){ returnView(); }
在渲染视图时HandleErrorAttribute过滤器会传递一个HandleErrorInfo视图模型对象这是一个封装了异常细节的封装程序
@modelHandleErrorInfo @{ ViewBag.Title="Sorry"; }@Model.Exception.StackTrace
备注:使用HandleError过滤器时一定要包含Model.Exception.StackTrace否则视图不会显示给用户,引用没必要给用户展示堆栈信息所以可以将该值放入div并隐藏
动作过滤器
用于任何目的的多用途过滤器
namespaceSystem.Web.Mvc{ //摘要:定义操作筛选器中使用的方法。 publicinterfaceIActionFilter{ //摘要:在执行操作方法后调用。 //参数:filterContext: //筛选器上下文。 voidOnActionExecuted(ActionExecutedContextfilterContext); //摘要:在执行操作方法之前调用。 //参数:filterContext: //筛选器上下文。 voidOnActionExecuting(ActionExecutingContextfilterContext); } }
ActionExecutingContext属性
ActionExecutedContext属性
结果过滤器:
它会对动作方法所产生的结果进行操作
namespaceSystem.Web.Mvc{ //摘要:定义结果筛选器所需的方法。 publicinterfaceIResultFilter{ //摘要:在操作结果执行后调用。 //参数:filterContext: //筛选器上下文。 voidOnResultExecuted(ResultExecutedContextfilterContext); //摘要:在操作结果执行之前调用。 //参数:filterContext: //筛选器上下文。 voidOnResultExecuting(ResultExecutingContextfilterContext); } }
动作方法如何返回动作结果,让用户能够将动作方法的意图与动作方法的执行分离。将结果过滤器运用于一个动作方法时会在动作方法返回结果时、但在执行该动作结果之前调用OnResultExecuting。动作结果执行之后调用OnResultExecuted
内建的动作过滤器和结果过滤器
Mvc框架包含一个内建的类,可以用来创建动作过滤器和结果过滤器,这个类的名称ActionFilterAttribute
namespaceSystem.Web.Mvc{ //摘要:表示筛选器特性的基类。 publicabstractclassActionFilterAttribute:FilterAttribute,IActionFilter,IResultFilter{ //摘要:在执行操作方法后由ASP.NETMVC框架调用。 //参数:filterContext: //筛选器上下文。 publicvirtualvoidOnActionExecuted(ActionExecutedContextfilterContext); //摘要:在执行操作方法之前由ASP.NETMVC框架调用。 //参数:filterContext: //筛选器上下文。 publicvirtualvoidOnActionExecuting(ActionExecutingContextfilterContext); //摘要:在执行操作结果后由ASP.NETMVC框架调用。 //参数:filterContext: //筛选器上下文。 publicvirtualvoidOnResultExecuted(ResultExecutedContextfilterContext); //摘要:在执行操作结果之前由ASP.NETMVC框架调用。 //参数:filterContext: //筛选器上下文。 publicvirtualvoidOnResultExecuting(ResultExecutingContextfilterContext); } }
使用这个类的唯一好处是不需要重写和实现不打算使用的方法。除此之外,直接实现过滤器接口没有任何好处
自定义实例:
publicclassProfileAllAttribute:ActionFilterAttribute{ privateStopwatchtimer; publicoverridevoidOnActionExecuting(ActionExecutingContextfilterContext){ timer=Stopwatch.StartNew(); } publicoverridevoidOnActionExecuted(ActionExecutedContextfilterContext){ timer.Stop(); filterContext.HttpContext.Response.Write( string.Format("Totalelapsedtime:{0}",timer.Elapsed.TotalSeconds)); } } publicclassHomeController:Controller{ [ProfileAll] publicActionResultIndex(){returnView();} }
其它过滤器属性:
publicabstractclassController:ControllerBase,IActionFilter,IAuthenticationFilter,IAuthorizationFilter,IDisposable,IExceptionFilter,IResultFilter,IAsyncController,IController,IAsyncManagerContainer
过滤器的几种实现形式:
①全局过滤器
在FilterConfig中直接注册实现类
②实现接口
③注解
对过滤器执行排序
过滤器是按类型执行的其顺序:授权-》Action-》result。如果有未处理异常,框架在任一阶段都会执行异常过滤器
namespaceSystem.Web.Mvc { //摘要:表示操作和结果筛选器特性的基类。 publicabstractclassFilterAttribute:Attribute,IMvcFilter{ //摘要:获取或设置一个值,该值指示是否可指定筛选器特性的多个实例。 //返回结果:如果可指定筛选器特性的多个实例,则为true;否则为false。 publicboolAllowMultiple{get;} //摘要:获取或者设置执行操作筛选器的顺序。 //返回结果:执行操作筛选器的顺序。 publicintOrder{get;set;} } }
内建过滤器
RequireHttps
RequireHttps过滤器让Action强制使用HTTPS协议。他将用户浏览器重定向到同一个动作,但使用‘https://'协议前缀
在形成不安全请求时,重写HandledNonHttpsRequest(),以创建自定义行为,该过滤器仅用于GET请求,POST则会丢掉数据;该过滤器时授权过滤器
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。