RBAC中使用行为过滤器和全局异常过滤器

发布时间 2023-10-23 19:29:15作者: 耿有才

在学习行为过滤器和异常过滤器是先要认识什么事行为过滤器和异常过滤器

  行为过滤器(Action Filters):ASP.NET MVC 框架中的一个功能,用于在控制器方法执行前后插入预定义的逻辑。通过行为过滤器,你可以在不修改原始方法代码的情况下,实现一些常见的横切关注点,例如日志记录、身份验证、授权等。

ASP.NET MVC 中,行为过滤器是通过继承 System.Web.Mvc.FilterAttribute 类并实现 System.Web.Mvc.IActionFilter 接口或其派生接口来创建的。常见的行为过滤器有以下几种类型:

  1. AuthorizationFilterAttribute:用于验证用户是否有权限访问特定的控制器或控制器方法。
  2. ActionFilterAttribute:在控制器方法执行前后执行逻辑,例如记录日志、性能监控等。
  3. ResultFilterAttribute:在操作结果执行前后执行逻辑,可用于操作结果的修改或处理。
  4. ExceptionFilterAttribute:在发生异常时执行特定的逻辑,例如捕获异常、记录错误信息等。

这些行为过滤器可以应用到控制器类、控制器方法或全局范围,以实现对请求和响应的统一处理。

  异常过滤器(Exception Filters):ASP.NET MVC 框架中的一个功能,用于在发生异常时执行预定义的逻辑。通过异常过滤器,你可以将处理错误的代码从控制器代码中分离出来,使得控制器代码更加简洁清晰。

ASP.NET MVC 中,异常过滤器是通过继承 System.Web.Mvc.FilterAttribute 类并实现 System.Web.Mvc.IExceptionFilter 接口或其派生接口来创建的。常见的异常过滤器有以下几种类型:

  1. HandleErrorAttributeASP.NET MVC 原生提供的异常过滤器,用于捕获和处理应用程序中未处理的异常。
  2. 自定义异常过滤器:根据实际需要自行编写的处理异常的过滤器

 接下来看在RBAC中如何使用行为过滤器和全局异常过滤器

  首先创建一个类进行输出的统一格式

 

  public class ResulrWapper
  {
  public int code { get; set; }//用来输出码的 例200 成功  400失败等
  public string message { get; set; }//输出错误的信息 例code400时密码错误
  public object data { get; set; }//显示出可以显示的信息 例 登录时   用户ID 用户名
  }

 

  

  public class ResultWrapperFilter : IActionFilter, IExceptionFilter
  {
   /// <summary>
   /// 在Action方法调用后,result方法调用前执行,使用场景:异常处理。
   /// </summary>
   /// <param name="context"></param>
   /// <exception cref="NotImplementedException"></exception>
   public void OnActionExecuted(ActionExecutedContext context)
   {
    //使用了两个 if 语句来检查 context.Result 的类型,并分别处理 ObjectResult 和 JsonResult。

    //ObjectResult :通用的结果对象,可以将任何类型的对象作为响应返回,还可以设置状态码、响应头、其它属性
    //JsonResult 是 ObjectResult 的一个具体实现,专门用于返回 JSON 格式的响应。
    if (context.Result is ObjectResult obj)
    {
      context.Result = new ObjectResult(new ResulrWapper
      {
        code =200,
        data= obj.Value
      });
    }
    if(context.Result is JsonResult json)
    {
      context.Result = new ObjectResult(new ResulrWapper
      {
      code = 200,
      data = json.Value
      });
    }
  }

    /// <summary>
    /// 在Action方法调用前使用,使用场景:如何验证登录等
    /// </summary>
    /// <param name="context"></param>
    /// <exception cref="NotImplementedException"></exception>
    public void OnActionExecuting(ActionExecutingContext context)
    {

    }

    下面的代码是全局异常过滤器

    /// <summary>
    /// 负责针对捕捉到异常的数据触发的函数。(全局异常)
    /// </summary>
    /// <param name="context"></param>
    /// <exception cref="NotImplementedException"></exception>
    public void OnException(ExceptionContext context)
    {
    context.Result = new ObjectResult(new ResulrWapper
    {
    code = 500,
    message = context.Exception.Message,
    });
    context.ExceptionHandled= true;
   }
  }