AspNetCoreRateLimit应用于MVC项目求助
AspNetCoreRateLimit应用于MVC项目求助
前言
之前发过一篇文章:
.NET Core WebApi接口ip限流实践 - 妙妙屋(zy) - 博客园 (cnblogs.com)
然后应用在前后端分离项目这个组件是非常好用的。但应用于不分离的项目,比如我的个人博客就有点麻烦。
就是我的需求是评论接口限流,然后触发限流后要回到文章页面告诉用户你触发了限流,但是,使用这个组件,他会将返回信息以页面的形式返回给你,我并不知道该如何去让他回到文章页面,也是琢磨了很久,用中间件去实现了这个效果,但是感觉不是很理想,如果有大佬知道更好的办法,可以私信或评论,感激不尽。
实现的效果图

评论接口

文章接口

_messages.Warning是博客开源作者封装的提示信息组件,可以采用别的方式去提示,问题不大。这里就是将从缓存中的提示信息提取出来,然后因为这里用的是缓存,用session做的唯一值处理,所以用session去取出来,如果从缓存中查出来存在,则提示被限流。
代码实现
原理就是把组件自带的信息提示设置为空字符串,自己在中间件中去使用。
这是限流规则:

这里参数就不做多的解释,可以去看之前发布的那篇文章。只要把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项目求助的更多相关文章
- Git应用于Android项目的入门知识:我的理解
Git应用于Android项目的基本知识. 常常将git,repo和gerrit三种工具配合起来使用,使Android开发中的部分工作自动化.并适应敏捷项目管理的需要. repo是Go ...
- AutoFac - 将 autofac 应用于MVC多层项目
一.前言 AutoFac是.NET平台下的一款著名的IoC Container,它可以让我们很轻松的解除项目中服务类的接口与客户类的接口实现类之间的依赖关系,从而降低系统各模块之间耦合程度以提高系统的 ...
- SharpZipLib.dll 压缩文件,可以应用于MVC, webform. C# windows application 等等地方
Nuget 安装:Install-Package ICSharpCode.SharpZipLib.dll private void WriteZipFile(string[] filesToZip, ...
- Emojicon表情之快速应用于Android项目
最近在项目中遇到了一个问题,找了半天原因,最后发现是用户在昵称中输入了emojicon表情,导致服务器不识别出现错误,而项目中也未对emojicon表情作支持,因此不得不考虑对emojicon表情做下 ...
- spring应用于web项目中
目标: 在webapp启动的时候取到spring的applicationContext对象,并把applicationContext对象存到servletContext里面,在需要的时候直接从serv ...
- CocoaPods应用于iOS项目框架管理方案
- MVC 无法将带 [] 的索引应用于“System.Dynamic.DynamicObject”类型的表达式
无法将带 [] 的索引应用于“System.Dynamic.DynamicObject”类型的表达式 说明: 执行当前 Web 请求期间,出现未经处理的异常.请检查堆栈跟踪信息,以了解有关该错误以及代 ...
- 领域驱动和MVVM应用于UWP开发的一些思考
领域驱动和MVVM应用于UWP开发的一些思考 0x00 起因 有段时间没写博客了,其实最近本来是根据梳理的MSDN上的资料(UWP开发目录整理)有条不紊的进行UWP学习的.学习中有了心得体会或遇到了问 ...
- IntelliJ IDEA上创建maven Spring MVC项目
IntelliJ IDEA上创建Maven Spring MVC项目 各软件版本 利用maven骨架建立一个webapp 建立相应的目录 配置Maven和SpringMVC 配置Maven的pom.x ...
- maven Spring MVC项目
IntelliJ IDEA上创建maven Spring MVC项目 各软件版本 利用maven骨架建立一个webapp 建立相应的目录 配置Maven和SpringMVC 配置Maven的pom.x ...
随机推荐
- Docker基本概念及命令
1.Docker三个重要概念:仓库(Repository).镜像(image)和容器(Container) Docker基本用法: docker 命令关键字(COMMAND) 一系列的参数 dock ...
- 【Beat】Scrum Meeting 4
时间:2021年6月29日 1.各个成员今日完成的任务以及贡献小时数 姓名 今日完成任务 贡献小时数 鑫 继续进行bug的修改 4 荣娟 继续进行bug的修改 4 亚楠 继续进行bug的修改 4 桂婷 ...
- getopts解析shell脚本命令行参数
getopts命令格式 getopts optstring name [arg] optstring为所有可匹配选项组成的字符串,每个字母代表一个选项.如果字母后有冒号:,表明该选项需要选择参数.比如 ...
- markdown常用语法及Typora的使用
一.markdown markdown简介 markdown是一种文档格式,后缀名为.md.markdown非常适于写博客,基本所有博客网站都支持markdown语法格式. 1.标题 mark ...
- PHP 文件和文件夹操作
文件夹操作 创建文件夹 mkdir(名称,权限,递归创建):创建文件 例如: #创建文件夹 mkdir('./aa') # 创建 aa 文件夹 mkdir('./aa/bb') # 在 aa 目录下创 ...
- 每次新建项目都要重新配置Maven项目很麻烦,这里出一个小技巧,配置一次就直接搞定所有的
Maven一次配置永久使用教程 首先,打开IDEA,将你目前放出来的项目关掉:(File->Close Project) 其次,在左侧栏里面选择这个: 然后,选择中间的这里: 接着,在弹出的页面 ...
- MySQL学习(一)大纲
1.逻辑架构 参考博客:https://blog.csdn.net/fuzhongmin05/article/details/70904190 最上层为客户端层,并非mysql独有,诸如:连接处理.授 ...
- LeetcodePractice-数组
目录 88. 合并两个有序数组 思路解析 字节&1. 两数之和 思路解析 腾讯&15. 三数之和 思路解析 18. 四数之和 思路解析 解释下,tmpSum为什么用int不行,需要用i ...
- Java中的String类真的不可变吗?java面试常见问题
其实在Java中,String类被final修饰,主要是为了保证字符串的不可变性,进而保证了它的安全性.那么final到底是怎么保证字符串安全性的呢?接下来就让我们一起来看看吧. 一. final ...
- 酷狗的kgma文件,居然包含两个版本
酷狗的kgma文件,居然可以包含两个版本,看看两首歌的歌曲信息. 歌曲信息中可以看到两首格式.时间.大小都是不一样的,但是这两首歌曲的本地文件地址都指向 F:\KuGou\KugouMusic\丸子呦 ...