2023年6月20日发(作者:)
5基础-过滤器(Filters)详解什么是过滤器?通过上⼀篇关于Controller控制器的⽂章我们知道,MVC中的每⼀个请求,都会分配给相应的控制器(Controller)和对应的⾏为⽅法(Action)去处理,那么如果我们想要在Action处理的前后加上⼀些额外的处理逻辑怎么办呢?这时候就⽤到了过滤器(Filters)。在 MVC的请求处理过程中有19个管道事件,这些事件分布在请求处理的各个节点中,⽐如BeginRequest(开始处理请求时触发)、AuthenticateRequest(对请求进⾏⾝份验证时触发)、AuthorizeRequest(对请求进程授权时触发)…等等等等。⽽过滤器的主要作⽤就是将我们的附加逻辑注⼊到这些请求处理管道中。在实际业务中,在Action⽅法前后添加额外附加逻辑的情况有很多,过滤器就是⽤来完成此功能。通过过滤器可以将与业务逻辑⽆关但经常需要执⾏的代码分离开,使我们的代码逻辑性更加清晰,代码更加简洁。过滤器的类型与作⽤MVC给我们提供了四种过滤器,基本满⾜了我们实际业务中常⽤的需求,包括以下:过滤器类型名称授权过滤器动作过滤器结果过滤器实现的接⼝默认的实现类作⽤执⾏的顺序与节点IAuthorizationFilterAuthorizeAttributeIActionFilterIResultFilter⽤于限制进⼊控制器或控制器的某个⾏为在控制器⽅法调⽤前执⾏,所有过滤器中⽅法最先执⾏的在控制器⽅法调⽤前/后执⾏在控制器⽅法调⽤完,跳转⾄view页⾯前/后执⾏ActionFilterAttribute⽤于进⼊动作⽅法之前或之后的处理ActionFilterAttribute⽤于动作⽅法返回结果之前或之后的处理HandleErrorAttribute异常处理过滤IExceptionFilter器⽤于处理某个动作⽅法或某个控制器⾥⾯在控制器⽅法抛出异常时执⾏抛出的异常这四种类型的接⼝是MVC对过滤器的⼀个接⼝规范,同时MVC默认通过AuthorizeAttribute(授权)、HandleErrorAttribute(异常处理)、ActionFilterAttribute(动作和结果)三个类实现了这四个接⼝。需要注意的是ActionFilterAttribute类既实现了IActionFilter接⼝,也实现了IResultFilter接⼝。这是个抽象类,要求必须提供⼀个实现,AuthorizeAttribute和HandleErrorAttribute类则包含了⼀些有⽤的特性,可以不必创建派⽣类进⾏使⽤。所以我们⼀般都会通过继承ActionFilterAttribute类,实现⾃定义的过滤器。除以上接⼝之外,我们还要⽤到FilterAttribute类,这个类将我们的过滤器包装成了特性,使我们的过滤器可以⽅便的在Action⽅法上⽅使⽤。定义过滤器过滤器有以下⼏个特点:可⽤于动作⽅法(Action)可⽤于控制器(Controller)可多个Filter同时使⽤不同级别可以混搭可运⽤于基类的过滤器,会影响该基类的所有派⽣类下⾯我们逐⼀介绍下基本过滤器的使⽤⽅法。授权过滤器所有实现了IAuthorizationFilter接⼝的都可以称之为授权过滤器。它的接⼝定义如下:namespace { // // 摘要: // 定义授权筛选器所需的⽅法。 public interface IAuthorizationFilter { // // 摘要: // 在需要授权时调⽤。 // // 参数: // filterContext: // 筛选器上下⽂。 void OnAuthorization(AuthorizationContext filterContext); }}授权过滤器是最先运⾏的过滤器,它运⾏在其它过滤器和Action⽅法之前。客户端请求在调⽤Action之前,MVC框架会检测Action上是否有授权过滤器,如果有会调⽤OnAuthorization⽅法,如果此⽅法批准了请求,才会调⽤相应的Action。流程如图:MVC默认使⽤AuthorizeAttribute实现了IAuthorizationFilter接⼝,所以我们可以在Action⽅法上直接添加Authorize特性标签来验证授权:打开Index页⾯,会显⽰⽆权限:由于使⽤的是MVC⾃带的授权验证⽅法,未能符合它的验证机制,所以⽆权限查看。通常我们需要添加⼀个新的派⽣⾃AuthorizeAttribute类的授权过滤器来完成我们⾃⼰业务逻辑。下⾯我们⾃定义⼀个授权过滤器。我们在MVC项⽬中添加⼀个Filters⽂件夹,我们所有⾃定义的过滤器都可以放到这个⽂件夹下,便于管理。在Filters下创建⼀个类,类名为MyAuthorizeAttribute。需要注意,过滤器要以Attribute结尾,这是MVC的约定。代码如下:public class MyAuthorizeAttribute : AuthorizeAttribute{ //重写授权检查⽅法,返回值为true,允许访问,false,禁⽌访问。 protected override bool AuthorizeCore(HttpContextBase httpContext) { //请求参数user为空,禁⽌访问 if (OrEmpty(tring["user"])) { return false; } return true; }}可以看到,我们只要重写AuthorizeCore⽅法就可以根据我们的业务需求判断是否有权限访问,返回值为true允许访问,返回值为false禁⽌访问。回到HomeController,我们给About⽅法加上我们⾃定义的特性:我们看看效果:可以看到,当About页⾯没有user参数时,会提⽰⽆权限,有user参数则可以访问通过。在实际业务中我们可以使⽤授权过滤器来管理⽤户登录状态的授权验证。当然,我的这个例⼦只是基础的⽤法,实际业务⽐这复杂的多,那么就需要我们⾃⼰去思考设计授权过滤器⽅法了。动作过滤器动作过滤器需要实现IActionFilter接⼝,接⼝定义如下://// 摘要:// 定义操作筛选器中使⽤的⽅法。public interface IActionFilter{ // // 摘要: // 在执⾏操作⽅法后调⽤。 // // 参数: // filterContext: // 筛选器上下⽂。 void OnActionExecuted(ActionExecutedContext filterContext); // // 摘要: // 在执⾏操作⽅法之前调⽤。 // // 参数: // filterContext: // 筛选器上下⽂。 void OnActionExecuting(ActionExecutingContext filterContext);}我们看到该接⼝⾥有两个⽅法OnActionExecuting和OnActionExecuted,前者在动作⽅法执⾏前调⽤,后者在动作⽅法执⾏后调⽤。OnActionExecuting⽅法是在Action⽅法执⾏前调⽤的,那么我们可以利⽤这个⽅法来检测请求,并且可以在这⾥修改请求,取消请求等等操作。OnActionExecuting⽅法的参数是⼀个ActionExecutingContext对象,它继承⾃ControllerContext类,属性如下:名称类型说明获取或设置操作描述符。获取或设置由操作⽅法返回的结果。ActionDescriptorActionDescriptorResultActionResultActionParametersIDictionary
2023年6月20日发(作者:)
5基础-过滤器(Filters)详解什么是过滤器?通过上⼀篇关于Controller控制器的⽂章我们知道,MVC中的每⼀个请求,都会分配给相应的控制器(Controller)和对应的⾏为⽅法(Action)去处理,那么如果我们想要在Action处理的前后加上⼀些额外的处理逻辑怎么办呢?这时候就⽤到了过滤器(Filters)。在 MVC的请求处理过程中有19个管道事件,这些事件分布在请求处理的各个节点中,⽐如BeginRequest(开始处理请求时触发)、AuthenticateRequest(对请求进⾏⾝份验证时触发)、AuthorizeRequest(对请求进程授权时触发)…等等等等。⽽过滤器的主要作⽤就是将我们的附加逻辑注⼊到这些请求处理管道中。在实际业务中,在Action⽅法前后添加额外附加逻辑的情况有很多,过滤器就是⽤来完成此功能。通过过滤器可以将与业务逻辑⽆关但经常需要执⾏的代码分离开,使我们的代码逻辑性更加清晰,代码更加简洁。过滤器的类型与作⽤MVC给我们提供了四种过滤器,基本满⾜了我们实际业务中常⽤的需求,包括以下:过滤器类型名称授权过滤器动作过滤器结果过滤器实现的接⼝默认的实现类作⽤执⾏的顺序与节点IAuthorizationFilterAuthorizeAttributeIActionFilterIResultFilter⽤于限制进⼊控制器或控制器的某个⾏为在控制器⽅法调⽤前执⾏,所有过滤器中⽅法最先执⾏的在控制器⽅法调⽤前/后执⾏在控制器⽅法调⽤完,跳转⾄view页⾯前/后执⾏ActionFilterAttribute⽤于进⼊动作⽅法之前或之后的处理ActionFilterAttribute⽤于动作⽅法返回结果之前或之后的处理HandleErrorAttribute异常处理过滤IExceptionFilter器⽤于处理某个动作⽅法或某个控制器⾥⾯在控制器⽅法抛出异常时执⾏抛出的异常这四种类型的接⼝是MVC对过滤器的⼀个接⼝规范,同时MVC默认通过AuthorizeAttribute(授权)、HandleErrorAttribute(异常处理)、ActionFilterAttribute(动作和结果)三个类实现了这四个接⼝。需要注意的是ActionFilterAttribute类既实现了IActionFilter接⼝,也实现了IResultFilter接⼝。这是个抽象类,要求必须提供⼀个实现,AuthorizeAttribute和HandleErrorAttribute类则包含了⼀些有⽤的特性,可以不必创建派⽣类进⾏使⽤。所以我们⼀般都会通过继承ActionFilterAttribute类,实现⾃定义的过滤器。除以上接⼝之外,我们还要⽤到FilterAttribute类,这个类将我们的过滤器包装成了特性,使我们的过滤器可以⽅便的在Action⽅法上⽅使⽤。定义过滤器过滤器有以下⼏个特点:可⽤于动作⽅法(Action)可⽤于控制器(Controller)可多个Filter同时使⽤不同级别可以混搭可运⽤于基类的过滤器,会影响该基类的所有派⽣类下⾯我们逐⼀介绍下基本过滤器的使⽤⽅法。授权过滤器所有实现了IAuthorizationFilter接⼝的都可以称之为授权过滤器。它的接⼝定义如下:namespace { // // 摘要: // 定义授权筛选器所需的⽅法。 public interface IAuthorizationFilter { // // 摘要: // 在需要授权时调⽤。 // // 参数: // filterContext: // 筛选器上下⽂。 void OnAuthorization(AuthorizationContext filterContext); }}授权过滤器是最先运⾏的过滤器,它运⾏在其它过滤器和Action⽅法之前。客户端请求在调⽤Action之前,MVC框架会检测Action上是否有授权过滤器,如果有会调⽤OnAuthorization⽅法,如果此⽅法批准了请求,才会调⽤相应的Action。流程如图:MVC默认使⽤AuthorizeAttribute实现了IAuthorizationFilter接⼝,所以我们可以在Action⽅法上直接添加Authorize特性标签来验证授权:打开Index页⾯,会显⽰⽆权限:由于使⽤的是MVC⾃带的授权验证⽅法,未能符合它的验证机制,所以⽆权限查看。通常我们需要添加⼀个新的派⽣⾃AuthorizeAttribute类的授权过滤器来完成我们⾃⼰业务逻辑。下⾯我们⾃定义⼀个授权过滤器。我们在MVC项⽬中添加⼀个Filters⽂件夹,我们所有⾃定义的过滤器都可以放到这个⽂件夹下,便于管理。在Filters下创建⼀个类,类名为MyAuthorizeAttribute。需要注意,过滤器要以Attribute结尾,这是MVC的约定。代码如下:public class MyAuthorizeAttribute : AuthorizeAttribute{ //重写授权检查⽅法,返回值为true,允许访问,false,禁⽌访问。 protected override bool AuthorizeCore(HttpContextBase httpContext) { //请求参数user为空,禁⽌访问 if (OrEmpty(tring["user"])) { return false; } return true; }}可以看到,我们只要重写AuthorizeCore⽅法就可以根据我们的业务需求判断是否有权限访问,返回值为true允许访问,返回值为false禁⽌访问。回到HomeController,我们给About⽅法加上我们⾃定义的特性:我们看看效果:可以看到,当About页⾯没有user参数时,会提⽰⽆权限,有user参数则可以访问通过。在实际业务中我们可以使⽤授权过滤器来管理⽤户登录状态的授权验证。当然,我的这个例⼦只是基础的⽤法,实际业务⽐这复杂的多,那么就需要我们⾃⼰去思考设计授权过滤器⽅法了。动作过滤器动作过滤器需要实现IActionFilter接⼝,接⼝定义如下://// 摘要:// 定义操作筛选器中使⽤的⽅法。public interface IActionFilter{ // // 摘要: // 在执⾏操作⽅法后调⽤。 // // 参数: // filterContext: // 筛选器上下⽂。 void OnActionExecuted(ActionExecutedContext filterContext); // // 摘要: // 在执⾏操作⽅法之前调⽤。 // // 参数: // filterContext: // 筛选器上下⽂。 void OnActionExecuting(ActionExecutingContext filterContext);}我们看到该接⼝⾥有两个⽅法OnActionExecuting和OnActionExecuted,前者在动作⽅法执⾏前调⽤,后者在动作⽅法执⾏后调⽤。OnActionExecuting⽅法是在Action⽅法执⾏前调⽤的,那么我们可以利⽤这个⽅法来检测请求,并且可以在这⾥修改请求,取消请求等等操作。OnActionExecuting⽅法的参数是⼀个ActionExecutingContext对象,它继承⾃ControllerContext类,属性如下:名称类型说明获取或设置操作描述符。获取或设置由操作⽅法返回的结果。ActionDescriptorActionDescriptorResultActionResultActionParametersIDictionary
发布评论