• .net core 5 拦截器


    .net core 拦截器的使用

    实例代码:https://gitee.com/D_C_L/InterceptorTest.git

    拦截器主要是将程序中的一些可以独立出去的模块进行拦截,比如幕等性,和身份认证服务等等,你想独立出去的东西,ActionFilterAttribute请求拦截器他里面几个方法,我们将一下的几个方法进行重写。

    1,OnActionExecuting:在执行请求开始之前进行调用

    2,OnActionExecuted:在执行请求开始之后进行调用

    3,OnResultExecuting:在执行请求结束前进行调用

    4,OnResultExecuted:在执行请求结束后进行调用

    列如:

    复制代码
            /// <summary>
             /// 在执行请求开始之前进行调用
            /// </summary>
            /// <param name="context">执行的上下文</param>
            public override void OnActionExecuting(ActionExecutingContext context)
            {
                context.HttpContext.Response.WriteAsync("在控制器执行之前调用");
            }
    复制代码

    里面可以编写你的代码,ActionExecutingContext 是请求进来的 上下文。

    这个是里面的一些属性,你可以进行相对应的使用。、

    异常拦截器的使用

    IExceptionFilter实现这个接口,在Startup类里面添加 app.UseExceptionHandler("/Home/Error");也可以调到错误页面去。或者想下面重写

    复制代码
    /// <summary>
            /// 当然是发生异常时被调用了
            /// </summary>
            /// <param name="context">执行的上下文</param>
            public void OnException(ExceptionContext context)
            {
                context.HttpContext.Response.WriteAsync("当然是发生异常时被调用了");
                context.ExceptionHandled = true;//异常已经处理,不要再次处理了
            }
    复制代码

    全局拦截

    如果说你要拦截你程序的所有请求,可以将拦截器配置到全局里面在Startup类添加一下代码。

    ActionAttribute是你拦截器的类名
    复制代码
                //全局拦截
                services.AddMvc(options =>
                {
                    options.Filters.Add(typeof(ActionAttribute));
                }).SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
    复制代码

    部分控制器不进行拦截

    当我们使用了全局拦截器之后,但是有的方法或者控制器我不想进行拦截器的话,我们可以编写一个空的拦截器不使用全局拦截器。

        /// <summary>
        /// 不需要登陆的地方加个这个空的拦截器
        /// </summary>
        public class NoSignAttribute : ActionFilterAttribute { }

    然后在方法或者控制器上面添加一下代码

    NoSignAttribute本来拦截器名称是这样的,我们可以忽略后面的默认名命NoSign
    复制代码
            /// <summary>
            /// 不需要登录使用这个[NoSign] 拦截器
            /// </summary>
            /// <returns></returns>
            [NoSign]
            public IActionResult Privacy()
            {
                return View();
            }
    复制代码

    然后我们在全局的拦截器里面在加上一段判断的代码,其实这个就是加上的两个拦截器,只是一个没有用,判断当前的请求方法或者控制上面有没有这个空的拦截器,如果有说明我们这个方法或者控制器不需要被拦截。直接返回出去。

    复制代码
            /// <summary>
            /// 在控制器执行之前调用
            /// </summary>
            /// <param name="context">执行的上下文</param>
            public override void OnActionExecuting(ActionExecutingContext context)
            {
                // 判断是否加上了不需要拦截
                var noNeedCheck = false;
                if (context.ActionDescriptor is ControllerActionDescriptor controllerActionDescriptor)
                {
                    noNeedCheck = controllerActionDescriptor.MethodInfo.GetCustomAttributes(inherit: true)
                      .Any(a => a.GetType().Equals(typeof(NoSignAttribute)));
                }
                if (noNeedCheck) return;
    
                context.HttpContext.Response.WriteAsync("在控制器执行之前调用");
            }
    复制代码

    局部拦截

    如果说你只想拦截某个控制器或者某个方法的时候,你可以在方法或者控制器上面添加拦截器的注释。

    ActionAttribute本来拦截器名称是这样的,我们可以忽略后面的默认名命Action

    复制代码
            /// <summary>
            /// 局部的使用拦截器
            /// </summary>
            /// <returns></returns>
            [Action]
            public IActionResult Index()
            {
                return View();
            }
    复制代码

    当然如果你不想使用拦截器,喜欢用中间件也可以,在管道请求的管道中直接进行拦截,这也是可以的。

  • 相关阅读:
    用graphviz,pygraphviz快速自动绘图
    python 实现的huffman 编码压缩,解码解压缩
    python 字符串的显示
    PKU acm 1651 multiplication puzzle
    SQL Server中的数据类型详解
    (转) treeview 的设计思路
    将英文的week 转换为中文的 简单的方法
    常用的文件对应的MIME类型:
    客户端传参问题
    绑定数据与截取的另外的一中写法
  • 原文地址:https://www.cnblogs.com/lzjsky/p/15783049.html
Copyright © 2020-2023  润新知