ASP.NET mvc4中的过滤器的使用

过滤器(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>

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wdpxgd.html