首页 > 编程语言 >AspNetCoreRateLimit应用于MVC项目求助

AspNetCoreRateLimit应用于MVC项目求助

时间:2023-05-07 23:00:38浏览次数:52  
标签:AspNetCoreRateLimit MVC 求助 Response responseBody Session context var 限流

AspNetCoreRateLimit应用于MVC项目求助

前言

之前发过一篇文章:

.NET Core WebApi接口ip限流实践 - 妙妙屋(zy) - 博客园 (cnblogs.com)

然后应用在前后端分离项目这个组件是非常好用的。但应用于不分离的项目,比如我的个人博客就有点麻烦。

就是我的需求是评论接口限流,然后触发限流后要回到文章页面告诉用户你触发了限流,但是,使用这个组件,他会将返回信息以页面的形式返回给你,我并不知道该如何去让他回到文章页面,也是琢磨了很久,用中间件去实现了这个效果,但是感觉不是很理想,如果有大佬知道更好的办法,可以私信或评论,感激不尽。

实现的效果图

image

评论接口

image

文章接口

image

_messages.Warning是博客开源作者封装的提示信息组件,可以采用别的方式去提示,问题不大。这里就是将从缓存中的提示信息提取出来,然后因为这里用的是缓存,用session做的唯一值处理,所以用session去取出来,如果从缓存中查出来存在,则提示被限流。

代码实现

原理就是把组件自带的信息提示设置为空字符串,自己在中间件中去使用。

这是限流规则:

image

这里参数就不做多的解释,可以去看之前发布的那篇文章。只要把Content设置为空字符串即可。

然后就开始去写中间件去处理触发了限流该怎么做

需要注册缓存服务

builder.Services.AddMemoryCache();

app.Use(async (context, next) =>
{
    var cache = context.RequestServices.GetRequiredService<IMemoryCache>();
    
    // 保存原始响应流
    var originalBody = context.Response.Body;
    
    // 创建一个新的响应流
    using var responseBody = new MemoryStream();
    context.Response.Body = responseBody;
    
    // 加载当前用户的 Session 对象
    await context.Session.LoadAsync();
    
    await next.Invoke();
    
    if (context.Response.StatusCode == 429)
    {
        var referer = context.Request.Headers["Referer"].ToString();
        
        // 从 Session 中获取一个字符串值
        var value = context.Session.GetString("key");
        if (string.IsNullOrEmpty(value))
        {
            // 如果 Session 中没有值,则设置一个字符串值
            context.Session.SetString("key", "value");
        }
        var sessionId = context.Session.Id;
        if (!cache.TryGetValue("Errors", out Dictionary<string, string> errors))
        {
            errors = new Dictionary<string, string>();
            cache.Set("Errors", errors, TimeSpan.FromSeconds(10));
        }
        
        errors[sessionId] = "您的请求已被限流,请稍后再试。";
        
        // 重置响应流位置
        responseBody.Seek(0, SeekOrigin.Begin);
        
        // 读取响应内容
        // var bodyText = new StreamReader(responseBody).ReadToEnd();
        
        // 设置新的响应流
        context.Response.Body = originalBody;
        
        // 设置新的响应状态码
        context.Response.StatusCode = 302;

        context.Response.Headers["Location"] = referer;
        
    }
    else
    {
        // 将响应流写回到原始响应流中
        responseBody.Seek(0, SeekOrigin.Begin);
        await responseBody.CopyToAsync(originalBody);
        
    }
});

注意这个中间件处理要放在app.UseRateLimit();前面。

结尾

AspNetCoreRateLimit原本就讲限流的ip存放在redis当中了的,但是我就是查不出来,如果能用该组件自带的方法查询出来,就不需要再写一个中间件,当429的时候再用缓存存一次会话了。

总之暂且先用这种办法吧,如果有更好的方法可以评论哟~

标签:AspNetCoreRateLimit,MVC,求助,Response,responseBody,Session,context,var,限流
From: https://www.cnblogs.com/ZYPLJ/p/17380401.html

相关文章

  • ASP.NET Core MVC 从入门到精通之序列化
    随着技术的发展,ASP.NETCoreMVC也推出了好长时间,经过不断的版本更新迭代,已经越来越完善,本系列文章主要讲解ASP.NETCoreMVC开发B/S系统过程中所涉及到的相关内容,适用于初学者,在校毕业生,或其他想从事ASP.NETCoreMVC系统开发的人员。经过前几篇文章的讲解,初步了解ASP.NETCore......
  • springmvc知识梳理 一篇就能让你的项目按照springmvc框架跑起来
    springmvc目录1.创建基本框架步骤2.@RequestMapping()2.1value属性2.1.1路径支持ant风格2.1.2restful风格2.2method属性2.2.1form表单问题:2.2.2get和post相关问题(涉及面试题):2.3param属性书写格式:thymeleaf语法:2.4headers属性3.获取请求参数......
  • SpringMvc
    SpringMVC1SpringMVC概述问题导入SpringMVC框架有什么优点?1.1SpringMVC概述SpringMVC是一种基于Java实现MVC模型的轻量级Web框架优点使用简单,开发便捷(相比于Servlet)灵活性强2入门案例【重点】问题导入在Controller中如何定义访问路径,如何响应数据?2.1实现步骤......
  • 使用IDEA2023创建springMVC项目,web项目
    1.使用idea2022创建web项目 2.新建模块 3.编写文件名,记住如果想单独一个项目,不想被包括在其他项目里面就取消位置后面的地址,它有可能是上一个项目的主文件 4.创建完主要项目以后要添加web模块,先选中需要添加web项目的模块,再店家上方+号,选择 web模块 3.修改部......
  • spring mvc 报406错误
    我也不知道真正的原因是什么,可能是返回的格式不正确吧,猜测而已,因为之前返回的是Map,这样不行,改为返回字符串String就可以了.原因是缺少jar包,详见http://jadethao.iteye.com/blog/1926525http://macrotea.iteye.com/blog/1179509......
  • IDEA导入SpringMvc文件-Tomcat部署web的文件
                    ......
  • Spring MVC 单元测试
    关键字:SpringMVC单元测试下面一步一步带领大家实现springMVC单元测试:新建一个基类:packagetest;importjavax.servlet.http.HttpServletRequest;importjavax.servlet.http.HttpServletResponse;importorg.junit.BeforeClass;importo......
  • spring3.0 mvc和rest入门例子
    关键字:spring3.0mvc和rest入门例子现在写个简单的小例子出来给初学者学习下。srping3也支持rest,所以例子也包括这部分内容。先看web.xml配置<!--像js,css,gif等静态文件,需要配置为默认的servlet--><servlet-mapping><servlet-name>defaul......
  • spring3.0 mvc rest 注解之@
    关键字:springmvcrest注解之@@RequestMapping@RequestParam@PathVariable@ModelAttributes@SessionAttributes@CookieValue@RequestHeader都是SpringMVCREST中的注释方法,这几种注释方法的用法如下:1#Controller示例URL示例:POST/users/quer......
  • springmvc大体工作流程
    1、用户发送HTTP请求到DispatcherServlet;2、DispatcherServlet调用HandlerMapping找到对应的处理器(类似Controller里的方法的RequestMapping),然后以HandlerExecutionChain执行链的形式返回给DispatcherServlet;3、DispatcherServlet把执行链中的Handler发送给HandlerAdapter;4、H......