首页 > 其他分享 >RBAC中使用行为过滤器和全局异常过滤器

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

时间:2023-10-23 19:34:45浏览次数:36  
标签:控制器 ObjectResult RBAC context 过滤器 全局 异常 public

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

  行为过滤器(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;
   }
  }

 

    

  

  

标签:控制器,ObjectResult,RBAC,context,过滤器,全局,异常,public
From: https://www.cnblogs.com/gyp2001/p/17783239.html

相关文章

  • RBAC的表结构创建
    简介:RBAC是指基于角色的访问控制(Role-BasedAccessControl),它是一种常见的访问控制模型,用于管理和控制用户对系统资源的访问权限。RBAC通过将用户和角色进行关联来管理权限,而不是直接将权限分配给个体用户。具体而言,RBAC模型包括以下几个核心概念:用户(User):系统中的实际用户。......
  • c语言程序设计全局变量与局部变量
    //运用scanf时要用#define_CRT_SECURE_NO_WARNINGS#define_CRT_SECURE_NO_WARNINGS#include<stdio.h>intnum1=5;//全局变量intmain(){ //未声明的标识符 //声明extern外部符号的 externintg_val; printf("g_val=%d\n",g_val); intnum1=10;//局部变量 //局......
  • Spring Boot中的过滤器、拦截器、监听器技巧汇总:让你快速成为大神
    环境说明:Windows10+Idea2021.3.2+Jdk1.8+SpringBoot2.3.1.RELEASE前言在Web应用程序中,我们经常需要处理请求和响应。有时,我们需要应用于所有请求和响应的通用逻辑。这就是过滤器、拦截器和监听器的用武之地。它们可以帮助我们在请求和响应被处理之前或之后执行一些通用逻......
  • SpringBoot中给Tomcat添加过滤器
    SpringBoot中给Tomcat添加过滤器目录SpringBoot中给Tomcat添加过滤器一、引入二、Filter功能概述三、添加过滤器进行实操3.1、注解版3.2、配置版本四、原理探究4.1、解析过程4.2、如何添加到ServletContext中?五、总结一、引入JavaWeb组件Servlet提供了filter过滤功能,其功能是对......
  • 在函数中使用全局变量
    内容来自DOChttps://q.houxu6.top/?s=在函数中使用全局变量如何在函数内部创建或使用全局变量?如何在其他函数中使用在其中一个函数中定义的全局变量?如果不适当地使用global关键字,通常会导致UnboundLocalError。关于这个错误的精确规则已在UnboundLocalErroronlocalvari......
  • Spring Boot中的过滤器、拦截器、监听器技巧汇总:让你快速成为大神
    环境说明:Windows10+Idea2021.3.2+Jdk1.8+SpringBoot2.3.1.RELEASE前言在Web应用程序中,我们经常需要处理请求和响应。有时,我们需要应用于所有请求和响应的通用逻辑。这就是过滤器、拦截器和监听器的用武之地。它们可以帮助我们在请求和响应被处理之前或之后执行一些通用逻......
  • SpringCloudAlibaba Seata在Openfeign跨节点环境出现全局事务Xid失效原因底层探究
    原创/朱季谦曾经在SpringCloudAlibaba的Seata分布式事务搭建过程中,跨节点通过openfeign调用不同服务时,发现全局事务XID在当前节点也就是TM处,是正常能通过RootContext.getXID()获取到分布式全局事务XID的,但在下游节点就出现获取为NULL的情况,导致全局事务失效,出现异常时无法正常回......
  • Django过滤器
    过滤器的用法#基本语法{{数据|过滤器:参数}} #前端用法<p>统计长度:{{s|length}}</p>#第一个参数是True就展示第一个参数的值、否则展示冒号后面的值<p>默认值:{{b|default:'为False时展示的值'}}</p><p>文件大小:{{file_size|filesizeformat}}</p><p>日期......
  • GIL全局解释器锁、互斥锁、线程队列、进程池和线程池的使用、多线程爬取网页、协程理
    进程和线程的比较进程的开销比线程的开销大很多进程之间的数据是隔离的,但是,线程之间的数据不隔离多个进程之间的线程数据不共享----->还是让进程通信(IPC)------->进程下的线程也通信了---->队列GIL全局解释器锁(重要理论)Python在设计之初就考虑到要在主循环中,同时只有一......
  • Spring 拦截器和过滤器
    目录Filter使Spring管理Filter方式一:@Component+@Order方式二:通过JavaConfig配置方式三:@WebFilter+@ServletComponentScan对比应用场景InterceptorpreHandlepostHandlerafterCompletion应用场景在SpringMVC中,Interceprtor与Filter两者的应用场景好像差不多,最大的......