资源过滤器—MVC中使用资源过滤器实现不执行Action方法体读取缓存信息返回

这篇具有很好参考价值的文章主要介绍了资源过滤器—MVC中使用资源过滤器实现不执行Action方法体读取缓存信息返回。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前言

上两篇文章分享了过滤器实现JWT进行鉴权,分别是通过授权过滤器和操作过滤器实现,这两个过滤器也是最常用的。文章链接:授权过滤器—MVC中使用授权过滤器实现JWT权限认证,操作过滤器—MVC中使用操作过滤器实现JWT权限认证,接下来将简单的谈谈资源过滤器在MVC中如何使用,一般项目中这个过滤器很少用到。

一、什么是资源过滤器?

过滤器(Filter)是 AOP(面向切面编程) 思想的一种实现,供我们在执行管道的特定阶段执行代码,通过使用过滤器可以实现短路请求、缓存请求结果、日志统一记录、参数合法性验证、异常统一处理、返回值格式化 等等,同时使业务代码更加简洁单纯,避免很多重复代码。所以在我们的过滤器中,大部分过滤器有开始执行action,即ing 状态的方法,也有action业务代码执行完后触发的ed状态的方法。

资源过滤器在过滤器管道中第二个被执行,通常用于请求结果的缓存和短路过滤器管道,通过实现接口 IResourceFilter 或者IAsyncResourceFilter。和其他过滤器一样,实现接口,只是接口不同,接收的参数两类型不同,但是这也正意味着执行的时机不同。接收的参数类型为:ResourceExecutedContext
资源过滤器—MVC中使用资源过滤器实现不执行Action方法体读取缓存信息返回

二、资源过滤器实现

资源过滤器定义:

资过滤器的定义,需要实现接口 IResourceFilter 或者IAsyncResourceFilter,接收的参数类型为:ResourceExecutedContext。

   /// <summary>
    /// 资源过滤器
    /// </summary>
    public class MyResourceFilter : Attribute, IResourceFilter//过滤器要继承Attribute 特性,这样我们也可以当做特性使用
    {
        /// <summary>
        /// 内存缓存对象
        /// </summary>
        private readonly IMemoryCache _memoryCache;
        /// <summary>
        /// 构造注入
        /// </summary>
        public MyResourceFilter(IMemoryCache memoryCache)
        {
            _memoryCache = memoryCache;
        }
        /// <summary>
        /// 资源过滤器过滤器执行之前(befor)
        /// </summary>
        /// <param name="context"></param>
        public void OnResourceExecuted(ResourceExecutedContext context)
        {
            //针对哪些Action,也可以吧特性标注在Action上
            var ad = context.ActionDescriptor;
            var str = ad.RouteValues["controller"] + "/" + ad.RouteValues["action"];
            if (str != "ResourceFilter/Test")
            {
                return;
            }
            //我们可以将当前的结果context.Result缓存起来,当执行ing时,直接返回,为了方便示例演示,我们用时间表示。
            string content = "Action第一次执行调用时间:" + DateTime.Now;
            var value = _memoryCache.Get("key"); //判断内存中是否有内容,有就直接返回,不再执行action过程。
            if (value == null)
            {
                _memoryCache.Set("key", content);
            }
        }
        /// <summary>
        /// 资源过滤器过滤器执行之后(after)
        /// </summary>
        /// <param name="context"></param>
        public void OnResourceExecuting(ResourceExecutingContext context)
        {
            //针对哪些Action,也可以吧特性标注在Action上
            var ad = context.ActionDescriptor;
            var str = ad.RouteValues["controller"] + "/" + ad.RouteValues["action"];
            if (str != "ResourceFilter/Test")
            {
                return;
            }
            var content = _memoryCache.Get("key"); //判断内存中是否有内容,有就直接返回,不再执行action过程。
            if (content != null)
            {
               var result = new { IsSuccess = true, Msg= _memoryCache.Get("key") };
                //短路返回,不会再执行Action中方法和OnResourceExecuted方法
                context.Result = new ContentResult() { Content = Newtonsoft.Json.JsonConvert.SerializeObject(result) };
            };
            }
        }
 

添加到全局过滤器:

   services.AddMvc(options =>
    {
       options.Filters.Add<MyResourceFilter>();
    });

添加测试Action:

/// <summary>
    /// 资源过滤器测试
    /// </summary>
    public class ResourceFilterController : ControllerBase
    {
        /// <summary>
        /// 内存缓存对象
        /// </summary>
        private readonly  IMemoryCache _memoryCache;
        /// <summary>
        /// 构造注入
        /// </summary>
        /// <param name="memoryCache"></param>
        public ResourceFilterController(IMemoryCache memoryCache)
        {
            _memoryCache = memoryCache;
        }
         
        /// <summary>
        /// 资源过滤器测试,获取接口第一次调用时间
        /// 如果第一次调用Action:会进入Action执行方法体
        /// 如果不是第一次调用Action:在资源过滤器中直接短路返回第一次调用时间
        /// </summary>
        /// <returns></returns>
        [HttpGet]
        public ActionResult Test()
        {
            string content = "Action第一次执行调用时间:" + DateTime.Now;
            var value = _memoryCache.Get("key"); //判断内存中是否有内容,有就直接返回,不再执行action过程。
            if (value == null)
            {
                _memoryCache.Set("key", content);
            }
            return Ok(new { IsSuccess = true, Msg = content });  
        }
    }

三、验证:

第1次调用:

访问地址:

https://localhost:5001/ResourceFilter/Test

资源过滤器—MVC中使用资源过滤器实现不执行Action方法体读取缓存信息返回

第N次调用:

资源过滤器—MVC中使用资源过滤器实现不执行Action方法体读取缓存信息返回文章来源地址https://www.toymoban.com/news/detail-639640.html

到了这里,关于资源过滤器—MVC中使用资源过滤器实现不执行Action方法体读取缓存信息返回的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • 【ASP.NET Core】MVC过滤器:运行流程

    【ASP.NET Core】MVC过滤器:运行流程

    MVC 的过滤器(Filters)也翻译为“筛选器”。但是老周更喜欢翻译为“过滤器”,意思上更好理解。 既然都叫过滤器了,就是在MVC的操作方法调用前后进行特殊处理的类型。比如: a、此调用是否已授权? b、在模型绑定之前要不要修改数据源?(可能含有儿童不宜的数据)

    2024年02月05日
    浏览(12)
  • 【ASP.NET Core】MVC过滤器:常见用法

    【ASP.NET Core】MVC过滤器:常见用法

    前面老周给大伙伴们演示了过滤器的运行流程,大伙只需要知道下面知识点即可: 1、过滤器分为授权过滤、资源访问过滤、操作方法(Action)过滤、结果过滤、异常过滤、终结点过滤。上一次咱们没有说异常过滤和终结点过滤,不过老周后面会说的。对这些过滤器,你有印

    2024年02月05日
    浏览(9)
  • gateway-过滤器执行顺序

    请求进入网关会碰到三类过滤器:当前路由过滤器、DefaultFilter、GlobalFilter。 请求路由后,会将当前路由过滤器和DefaultFilter、GlobalFilter,合并到一个过滤器链(集合)中,排序后依次执行每个过滤器 过滤器执行顺序 1.每一个过滤器都必须指定一个int类型的order值,order值越小

    2024年02月13日
    浏览(6)
  • Spring MVC获取参数和自定义参数类型转换器及编码过滤器

    Spring MVC获取参数和自定义参数类型转换器及编码过滤器

    目录   一、使用Servlet原生对象获取参数 1.1 控制器方法 1.2 测试结果 二、自定义参数类型转换器 2.1 编写类型转换器类 2.2 注册类型转换器对象  2.3 测试结果  三、编码过滤器 3.1 JSP表单 3.2 控制器方法 3.3 配置过滤器 3.4 测试结果  往期专栏文章相关导读  1. Maven系列专

    2024年02月10日
    浏览(10)
  • springbboot拦截器,过滤器,监听器及执行流程

    springbboot拦截器,过滤器,监听器及执行流程

    过滤器是在请求进入容器后,但请求进入servlet之前进行预处理的。请求结束返回也是,是在servlet处理完后,返回给前端之前 请求按照上图进入conteoller后执行完再返回 过滤器是Servlet规范中定义的一种组件,可以用于在请求进入Web应用程序之前或响应离开Web应用程序之前对请

    2024年02月13日
    浏览(6)
  • 使用维纳过滤器消除驾驶舱噪音(Matlab代码实现)

    使用维纳过滤器消除驾驶舱噪音(Matlab代码实现)

     💥💥💞💞 欢迎来到本博客 ❤️❤️💥💥 🏆博主优势: 🌞🌞🌞 博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️ 座右铭: 行百里者,半于九十。 📋📋📋 本文目录如下: 🎁🎁🎁 目录 💥1 概述 📚2 运行结果 🎉3 参考文献 🌈4 Matlab代码实现 驾驶舱

    2024年02月13日
    浏览(9)
  • 75.SpringMVC的拦截器和过滤器有什么区别?执行顺序?

    75.SpringMVC的拦截器和过滤器有什么区别?执行顺序?

    拦截器不依赖与servlet容器,过滤器依赖与servlet容器。 拦截器只能对action请求(DispatcherServlet 映射的请求)起作用,而过滤器则可以对几乎所有的请求起作用。 拦截器可以访问容器中的Bean(DI),而过滤器不能访问(基于spring注册的过滤器也可以访问容器中的bean)。 过滤器 和 拦

    2024年02月22日
    浏览(9)
  • 【看好了】如何使用fiddler实现手机抓包,Filters过滤器!

    【看好了】如何使用fiddler实现手机抓包,Filters过滤器!

    目录 一、Fiddler与其他抓包工具的区别 二、Fiddler的工作原理 三、使用fiddler实现手机抓包 四、Filters过滤器 1、Firebug虽然可以抓包,但是对于分析http请求的详细信息,不够强大。模拟http请求的功能也不够,且firebug常常是需要“无刷新修改”,如果刷新了页面,所有的修改都

    2024年02月09日
    浏览(10)
  • 在Spring boot中 使用JWT和过滤器实现登录认证

    在Spring boot中 使用JWT和过滤器实现登录认证

    在navicat中运行如下sql,准备一张user表 导入pom.xml坐标 在工utils包下创建一个用于生成和解析JWT 令牌的工具类 在pojo包下创建user类 在mapper包下添加 UserMapper接口 在service包下添加 UserService类 在utils包下添加统一响应结果封装类 在controller包下添加LoginController类 这样登录获取toke

    2024年02月06日
    浏览(10)
  • spring boot过滤器实现项目内接口过滤

    spring boot过滤器实现项目内接口过滤

    由于业务需求,存在两套项目,一套是路由中心,一套是业务系统. 现在存在问题是,路由中心集成了微信公众号与小程序模块功能,业务系统部署了多套服务. 现在需要通过调用路由中心将接口重新路由到指定的业务系统中 将小程序,公众号用户信息与业务系统做绑定 将路由中心的

    2023年04月20日
    浏览(13)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包