如何判断1分钟内请求次数在20次之内

自己考虑的算法是这样的,先取当前时间记为startTime,然后请求判断部分,对于第一个请求判断当前时间-startTime是否小于1分钟,如果小于1分钟则请求计数加1,第二个请求判断当前时间-startTime是否小于1分钟。。。。(这里的startTime我设为static Date startTime = new Date();但是每次都会将初始的给定时间设为当前时间,这个怎样能让startTime保持为静态时间变量,当时间到达1分钟后再更新他为当前时间那)有没有大侠遇到过?

0
j_clxy
clxy大叔 虽然你已经采纳了,但是请允许我再唠叨下。 你下面贴出做法是不够严谨的。 比如我贴出例子 [quote]比如第1分10秒1次,第1分59秒19次,第2分20秒再1次时如何?[/quote] 按照你的算法,第2分20秒的这次会被做为过多请求而被拒绝。 但是实际上,在距离这次请求的1分钟以内只有20次,应该作为合法请求。 你可以再想想。
6 年多之前 回复
chop123
chop123 感谢亲的回复!搞定了,我用的比较简单的设了一个static静态变量记录时间和static静态变量记录次数,并且用到了synchronized对static变量进行更新操作,感谢亲的回答用synchronized真的解决了问题!也感谢其他同学的回答~~
6 年多之前 回复

10个回答

首先,这个处理应该是IP地址级别或session级别的。就是说每个IP地址或每个session做此限制。所以你这个时间设成static即jvm级别的,恐怕不大对头吧?

我的计算逻辑是这样的:

1.每个IP或session维护个访问时间的列表。
2.每次该IP或session有访问时,取当前时间,然后减去1分钟。
3.删除【1】中的列表里,所有小于【2】的时间的数据。
4.a. 如果【3】处理后的列表个数小于20,允许访问,添加本次访问时间。
4.b. 如果大于等于20,拒绝访问。

但是,除非这是你们已经规定好的逻辑。
否则,通常的限制是,刷新间隔不得小于某固定时间(比如1秒或几秒)。

逻辑就会简单多了,像你上面那样,只需要个上次访问时间即可。
但还得是IP地址或session级别的才对。

0
chop123
chop123 是web开发的 呵呵 我再想想怎么处理
6 年多之前 回复
j_clxy
clxy大叔 我想当然的认为是web开发,所以提到了同步。 如果不是web或者没有并发,那是不用考虑同步这些事情。 如果是,则需要同步。简单些的话,需要用static变量做锁,比如 [code="java"] synchronized (static变量) { //处理 } [/code] 再来说你的方法,我认为逻辑不对,实现不了需求。 你可以自己多造些模拟数据,不要只有初始的数据。 比如第1分10秒1次,第1分59秒19次,第2分20秒再1次时如何?
6 年多之前 回复
chop123
chop123 谢谢您的回复。你说的session处理的是么?我还没接触过,刚开始做java开发,我写的很简单的不知道行不行得通: public class Check{ private static Date startTime = new Date();//初始时间先是当前系统时间 private static long temp;//临时记录请求次数 public void execute() throws Exception{ Date now = new Date(); if(now.getTime()-startTime().getTime<=6000 && temp<=20)//如果当前时间距离初始时间在1分钟内且请求次数小于20次 temp++;//计数加1 else{ startTime = new Date();//重置startTime为当前系统时间 temp=0;//临时计数清0 return; } } 自己想的就是这种比较笨的办法,不知道系统并发请求这个接口时有没有问题?
6 年多之前 回复
j_clxy
clxy大叔 记得要同步。
6 年多之前 回复
j_clxy
clxy大叔 如果需求是针对整个系统的,即系统在1分钟内只允许N次的话,那么用static倒也没问题。 你的算法看上去实在不够清晰,而且只有一个startTime应该是实现不了的。 还请参考我的逻辑吧。 也就是,维护一个static的列表,每次有访问来的时候按照上面的逻辑,从【2】开始处理就OK了。
6 年多之前 回复
chop123
chop123 非常感谢您的回复!其实我不清楚这样的需求的实现方式,我自己简单写的能否满足。需求是不需要对IP做限制的,只是对请求次数做限制,1分钟内运行访问20次,前端用http请求,后端json格式返回的,不知道你说的session是咋样来实现的?能否说明下下
6 年多之前 回复

自己写个filter,拦截所有的请求
再启动个线程或者timer什么的,1分钟重置一次
要注意的是filter是两次的

0

是单例吗?

保证单例,然后需要起一个线程去维护静态startTime,每个1000ms,重置startTime为当前系统时间。

0

楼主的提问有点不知所云啊,楼主是想统计每分钟请求不超过20个么?如果某分钟请求了19个,但都集中在最后一秒,下一分钟也请求了19个,但都集中在第一秒,岂不是2秒就请求了38个了?楼主的统计方式不太对吧?或者楼主只是想维持一个一分钟刷新一次的对象?

0

每个IP对应一个队列(FIFO)队列长度为20,队列中保存访问时间

如果
队头 - 队尾 > 60秒 说明请求太频繁了

0
ieanwfg201
ieanwfg201 我觉得使用循环链表比较好点,队列的话涉及到移位,比较耗费性能。
6 年多之前 回复
xly_971223
xly_971223 说反了, 队头 - 队尾 < 60秒, 命中
6 年多之前 回复

tcp、ip有个时间滑动窗口,不知道有没有可以借鉴的地方?其实Esper应该有相关的实现,可以参考。

0

作者问题提的有点模糊,我可以这样理解 吗?就是保持任何时间段(一分钟)内的请求数小于20。如果是这样的话,我们可以创建一个SIZE为20的容器(队列)。元素为time+data,也就是你说的请求。每次往里插入的时候,判断一下容器中元素的time是在一分钟之内的就可以了。如果队首的元素time在一分钟之内,队列已满(20个),刚说明一分种之内的请求已大于20了。

0

我觉得用queue比较好

0

请问你是不是需要一个这样的程序?
[code="java"]
/**

  • @author John zhang
  • @version 1.0
    */
    public class RequestOutOf20 {

    static Date startTime = new Date();
    static long ONE_MINUTE = 1 * 60 * 1000L;

    int requestCounter = 0;
    int timeCounter = 1;

    void request() {
    long curTime = System.currentTimeMillis();
    if (curTime - startTime.getTime() > ONE_MINUTE) {
    System.out.println(String.format("第%s分钟请求为%s次", timeCounter, requestCounter));
    String msg = (requestCounter > 20) ? "已超过20次": "未超过20次";
    System.out.println(msg);
    timeCounter++;
    requestCounter = 0;
    startTime = new Date();
    return;
    }
    requestCounter++;
    }

    public static void main(String args[]) {
    RequestOutOf20 req = new RequestOutOf20();
    for(int i = 0; i < 200000; i++) {
    req.request();
    Random r = new Random();
    int interval = r.nextInt(10) * 1000;
    System.out.println(String.format("间隔时间为%s秒", interval));
    try {
    Thread.sleep(interval);
    } catch (InterruptedException e) {
    e.printStackTrace();
    }
    }
    }
    }
    [/code]

0
z276356445t
z276356445t 我以为你只是需要一个怎么去计算的程序, 而且在不同的场景下选择的用法也不同, 我只是提供给你一个思路.
6 年多之前 回复
chop123
chop123 如果用于web开发要支持多线程访问的话,还是得用synchronized的吧,亲!
6 年多之前 回复
0
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
修改密码时限制1分钟内请求次数,超过次数的请求拒绝处理
参考的思路是 Servlet实现用户请求次数的统计 此文档的业务是统计请求次数,并没有限制次数。 需要掌握的内容:1,Session:生命周期,原理。发现除了HttpServletRequest,getSession() 。shiro框架也有Session:SecurityUtils.getSubject().getSession(),此次使用的Shiro框架的session,且查看了Shir...
如何判断点击次数?
如何实现对某一连接点击次数的统计?
如何判断资源下载的次数
我的下载部分是这样写的rnprotected void DownloadFile(string filename)rn rn rn string saveFileName = filename;rn rn System.IO.FileInfo fi = new System.IO.FileInfo(saveFileName);rn string fileextname = fi.Extension;rn string DEFAULT_CONTENT_TYPE = "application/vnd.ms-word"; //need to be updatedrn RegistryKey regkey, fileextkey;rn string filecontenttype;rn tryrn rn regkey = Registry.ClassesRoot;rn fileextkey = regkey.OpenSubKey(fileextname);rn filecontenttype = fileextkey.GetValue("Content Type", DEFAULT_CONTENT_TYPE).ToString();rn rn catchrn rn filecontenttype = DEFAULT_CONTENT_TYPE;rn rn Response.Clear();rn Response.Charset = "utf-8";rn Response.Buffer = true;rn this.EnableViewState = false;rn Response.ContentEncoding = System.Text.Encoding.UTF8;rnrn Response.AppendHeader("Content-Disposition", "attachment;filename=" + saveFileName);rn Response.ContentType = filecontenttype;rnrn Response.WriteFile(filename);rn Response.Flush();rn Response.Close(); rn rn想计算下载的次数,但是下载的框框出来之后不知道怎么判断点击的是下载还是取消。。。取消了就不应该计数rn[img=C:\Documents and Settings\Administrator\桌面\搜狗浏览器截图.jpg][/img]
filter问题,我要通过 Filter 做一个1分钟内限制请求次数的程序
我要通过 Filter 做一个1分钟内限制请求次数的程序。基本思想是这样,先记录一个开始时间,rnrn当请求过来时先判断时间是否已经过了你要求的时间,计数器清零,然后在++,如果没有过那么rnrn就直接判断是否已过了你要求的数目上限。下边是已经完成的程序,高手补充下,谢谢。rnpublic class SessionSingleFilter implements Filter rnrn private static final Logger LOG = Logger.getLogger(SessionSingleFilter.class);rnrn public void init(FilterConfig filterConfig) throws ServletException rn rnrn public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain)rn throws IOException, ServletException rn filterChain.doFilter(servletRequest, servletResponse);rn System.out.println("Filter66");rnrn Calendar c =Calendar.getInstance();rn Date date = c.getTime();rn HttpServletRequest httpServletRequest=(HttpServletRequest)servletRequest;rn HttpServletResponse httpServletResponse=(HttpServletResponse)servletResponse;rn HttpSession httpsession=httpServletRequest.getSession();rn Object jspzi= httpsession.getAttribute("a");rn System.out.println(jspzi);rnrn rn rnrn public void destroy() rn rnrn
Filter 问题,我要通过 Filter 做一个1分钟内限制请求次数的程序
rn我要通过 Filter 做一个1分钟内限制请求次数的程序。基本思想是这样,先记录一个开始时间,rnrn当请求过来时先判断时间是否已经过了你要求的时间,计数器清零,然后在++,如果没有过那么rnrn就直接判断是否已过了你要求的数目上限。下边是已经完成的程序,高手补充下,谢谢。rnpublic class SessionSingleFilter implements Filter rnrn private static final Logger LOG = Logger.getLogger(SessionSingleFilter.class);rnrn public void init(FilterConfig filterConfig) throws ServletException rn rnrn public void doFilter(ServletRequest servletRequest, ServletResponse rnrnservletResponse, FilterChain filterChain)rn throws IOException, ServletException rn filterChain.doFilter(servletRequest, servletResponse);rn System.out.println("Filter66");rnrn Calendar c =Calendar.getInstance();rn Date date = c.getTime();rn HttpServletRequest httpServletRequest=(HttpServletRequest)servletRequest;rn HttpServletResponse httpServletResponse=(HttpServletResponse)servletResponse;rn HttpSession httpsession=httpServletRequest.getSession();rn Object jspzi= httpsession.getAttribute("a");rn System.out.println(jspzi);rnrn rn rnrn public void destroy() rn rn
判断某时间段内记录出现次数
[code=HTML]rnrn表:#temprn字段 name sjrn 小三 2011-10-10rn 小四 2011-10-11rn 小三 2011-10-14rn。。。。。。rnrndeclare ksrq varchar(10), --开始日期rn jsrq varchar(10) --结束日期rnrn--ksrq,jsrq是任意的两个时间段rnselect name,conunt(1)as cs from #temp where sj between ksrq and jsrq rnrn我现在想要知道5天内name出现过两次相同的值,并记录为 1, 然后进行统计,如上面小三出现时间间隔没超过5天就记录为1rnrn[/code]
php如何限制请求次数
搞了个搜索页面,rnrn搜索的内容也直接表单提交录入数据库,rnrn然后发现有好多 注入的 语句 也被转义后写入并显示初来了。rnrn我该怎么应对。是限制请求次数 还是咋的,rnrn限制请求次数 要怎么弄呢。rnrn弄个密钥 搜索一次就失效一次,下一次搜索就要刷新页面重新请求一下新密钥,rnrnrn这样貌似也不靠谱
如何nginx服务器最大请求次数
最近服务器遭受攻击,一个IP一秒内N次请求,请教如何设置访问限制。rn以下是web访问日志:rn222.187.222.118 - - [09/Jul/2013:19:00:52 +0800] "GET /forum-2-9.html HTTP/1.1" 499 0 "" "" -rn122.72.124.53 - - [09/Jul/2013:19:00:52 +0800] "GET /forum-2-9.html HTTP/1.0" 502 166 "" "" 124.232.163.243rn218.108.242.108 - - [09/Jul/2013:19:00:52 +0800] "GET /forum-2-9.html HTTP/1.1" 502 166 "" "" 124.232.163.243rn222.141.199.150 - - [09/Jul/2013:19:00:52 +0800] "GET /forum-2-9.html HTTP/1.1" 502 166 "" "" 124.232.163.243rn222.85.64.219 - - [09/Jul/2013:19:00:52 +0800] "GET /forum-2-9.html HTTP/1.0" 502 166 "" "" 124.232.163.243rn190.151.122.38 - - [09/Jul/2013:19:00:52 +0800] "GET /forum-2-9.html HTTP/1.1" 502 166 "" "" 124.232.163.243rn200.143.148.254 - - [09/Jul/2013:19:00:52 +0800] "GET /forum-2-9.html HTTP/1.1" 499 0 "" "" 124.232.163.243rn61.19.252.92 - - [09/Jul/2013:19:00:52 +0800] "GET /forum-2-9.html HTTP/1.0" 502 166 "" "" 124.232.163.243rn204.84.216.200 - - [09/Jul/2013:19:00:52 +0800] "GET /forum-2-9.html HTTP/1.1" 502 166 "" "" 124.232.163.243rn60.190.136.90 - - [09/Jul/2013:19:00:52 +0800] "GET /forum-2-9.html HTTP/1.1" 502 166 "" "" 124.232.163.243rn178.208.255.123 - - [09/Jul/2013:19:00:52 +0800] "GET /forum-2-9.html HTTP/1.1" 502 166 "" "" 124.232.163.243,
1分钟内打扫系统垃圾
好用 方便效率高 绿色软件 。。。。。。。。。
如何判断2次http请求,间隔时间内超时?
我想把实时的状态信息写库,比如正在升级,升级完成等(这些信息都标识在客户端用c发送的http请求头中),rn但要是中间哪步客户端不发送请求了,我就把超时信息写库。rnrn
Spring-Boot+AOP+统计单次请求方法的执行次数和耗时情况
package com.yanshu.aspect; import java.util.*; import org.aspectj.lang.JoinPoint;   import org.aspectj.lang.ProceedingJoinPoint;   import org.aspectj.lang.annotation.AfterReturning;  
如何判断内是否
如何判断内是否
如何判断字符串出现次数
string a="shhs;fsif;ewiewui;iweui;"rn如何判断;号出现了多少次?不使用JS,要在后台的.cs文件中判断。求解
如何判断一个点在一个矩形内?(20分)
谢谢~~~(请出示代码)
如何判断ajax 请求
原文-----------http://blog.csdn.net/j080624/article/details/73775835首先需要明白一点AJAX请求中主要对象(原生对象)是什么?XMLHttpRequest具体参考AJAX的前生今世 (http://blog.csdn.net/j080624/article/details/55101279)。知道了该对象,那么就可以通过判断请求头属性...
如何判断连续出现次数
有这么个INT 字段 数据只有 1或2或3rnrn只要1在2前面,2在3前面,3再1前面 就是连续的rnrn比如: 1231232312312313123 如何判断最多连续出现的次数呢
怎样判断时间相差1分钟
这样判断两个时间相差大于1分钟rnrn如 2007-05-28 11:28:30和2007-05-28 12:28:30
asp.net判断用户登录错误次数3次,就不能在登陆了!
asp.net判断用户登录错误次数3次,就不能在登陆了!rn求代码…………
一分钟之内限制操作次数的算法
假如有个聊天室,要对用户的操作行为进行限制,当用户在一分钟之内连续发言20次,则给出发言太快的提示。rn求大家能给好好点的算法,给点思路也行。 要求不能用cookie.rn谢谢大家
933. 最近的请求次数
吐槽一句,这题说实话题目看着很难理解。 一、队列 class RecentCounter(object): def __init__(self): self.pings = list() def ping(self, t): &quot;&quot;&quot; :type t: int :rtype: int ...
Leetcode 最近的请求次数
写一个 RecentCounter 类来计算最近的请求。 它只有一个方法:ping(int t),其中 t 代表以毫秒为单位的某个时间。 返回从 3000 毫秒前到现在的 ping 数。 任何处于 [t - 3000, t] 时间范围之内的 ping 都将会被计算在内,包括当前(指 t 时刻)的 ping。 保证每次对 ping 的调用都使用比之前更大的 t 值。 示例: 输入:...
100、最近的请求次数
写一个 RecentCounter 类来计算最近的请求。 它只有一个方法:ping(int t),其中 t 代表以毫秒为单位的某个时间。 返回从 3000 毫秒前到现在的 ping 数。 任何处于 [t - 3000, t] 时间范围之内的 ping 都将会被计算在内,包括当前(指 t 时刻)的 ping。 保证每次对 ping 的调用都使用比之前更大的 t 值。 示例: 输入:inputs = ...
LeetCode-Python-933. 最近的请求次数
写一个RecentCounter类来计算最近的请求。 它只有一个方法:ping(int t),其中t代表以毫秒为单位的某个时间。 返回从 3000 毫秒前到现在的ping数。 任何处于[t - 3000, t]时间范围之内的ping都将会被计算在内,包括当前(指t时刻)的ping。 保证每次对ping的调用都使用比之前更大的t值。 示例: 输入...
统计请求次数
今天用户说需要统计两个url的请求次数,由于我们的文件是按天分割,所以就比较好办。 循环读取文件,然后统计出现的次数即可。再拷贝到Excel中生成图表。 #/bin/bash LOG_PATH=/data/apache_log/ for file in $(ls $LOG_PATH/access_log.*); do count1=$(grep "/suggestion01"
[leetcode]最近的请求次数
933. 最近的请求次数 写一个 RecentCounter 类来计算最近的请求。 它只有一个方法:ping(int t),其中 t 代表以毫秒为单位的某个时间。 返回从 3000 毫秒前到现在的 ping 数。 任何处于 [t - 3000, t] 时间范围之内的 ping 都将会被计算在内,包括当前(指 t 时刻)的 ping。 保证每次对 ping 的调用都使用比之前更大的 t 值。 示例:...
[933] 最近的请求次数
<p>rn 算法设计与分析是考察程序开发人员技术水平的重要内容之一,并且在企业面试、日常工作、都占有重要的地位。然而,不同与数据结构,初步进入软件开发行业的学员往往对于算法存在敬畏和畏怯的心理。为了帮助广大学员朋友切实提升程序开发技巧,积累学习信心,克服畏难情绪,丁宋涛和夏曹俊老师共同精心设计了本门课程。丁宋涛老师常年服务于普通类本科院校的教育教学,同时拥有蓝桥杯全国二等奖、省赛一等奖的指导经验,拥有专业性的教学指导经验;同时,本课程从北京大学onlinejudge入手,从浅入深的讲解基本算法的核心思想;再结合leetcode企业级真题库为广大程序员顺利求职加薪提供助力。leetcode是企业级笔试面试的专业题库,是广大求职人员都需要打磨、参考的宝贵资料。为了能脚踏实地的服务最广大的程序员朋友,本课程将以基础的形式为广大求职人员提供完备的参考手册,为提升薪资、获取高阶的工作机会提供切实有效的帮助。rn</p>rn<p>rn <img src="https://img-bss.csdn.net/201906120922216522.png" alt="" /> rn</p>rn<p>rn <img src="https://img-bss.csdn.net/201906120921587805.png" alt="" /> rn</p>rn<p>rn <img src="https://img-bss.csdn.net/201906120921242101.png" alt="" /> rn</p>
nginx 限制请求次数
1 配置( limit_req_zone ) 在nginx.conf 中 server配置之前 加:    #表示 请求限制 binary_remtoe_addr 同一个客户端的ip地址在一秒内只有一个请求   #rwq_zone 表示限制的名称     limit_req_zone  $binary_remote_addr zone=rwq_zone:1m rate=1r/s;
掷骰子20次 统计结果
点击(此处)折叠或打开 #include stdio.h> #include stdlib.h> /* main */ int main(void){     int x;
判断元素是否在视窗之内
作为一名前端工程师我们经常需要判断目标元素是否在视窗之内或者和视窗的距离小于一个值(例如 100 px),从而实现一些常用的功能,例如: 图片的懒加载 列表的无限滚动 计算广告元素的曝光情况 可点击链接的预加载 说明:可点击链接的预加载 这个功能目前使用的网站还比较少,其实就是“预先获取页面可视区域内的链接,加快后续加载速度”,能极大提升用户在站内跳转时的体验,由 Google 在 2018...
判断当前日期是否在范围之内
//判断当前日期是否在范围之内 private boolean inRange(Date start, Date end){ Date now = new Date(); if (now.before(start) || now.after(end)){ return false; } return true; }
java判断100之内的质数
质数就是只能被1和自身整除的数。 int j; for(int i = 2; i &amp;lt;= 100; i++){ j = 2; while (i%j != 0){ j++; if(j==i){ System.out.print(...
判断质点在四边形之内
在做图像处理的时候,有时候要求判断某兴趣点是不是中某四边形之内,这个小程序提供了一个算法。输入是四边形的四个顶点a[4]和兴趣点fi;如果返回值是true表示fi在a[4],否则不在四边形之内。
如何判断一个请求是否是上传文件的请求
请问高手:如何判断一个请求是否是上传文件的请求,有人给我说在Cookie里判断,我试了但是不行。如果解决了可以再加分。
判断日期是否在7天之内
比较当前的时间和7天或者n天的大小关系 Date date = new Date(); //获取当前时间                             Date s00 = (Date) pageData.get("addTime"); //获取需要比较的目标时间                          
如何判断请求是否是AJAX请求
首先需要明白一点AJAX请求中主要对象(原生对象)是什么?XMLHttpRequest具体参考AJAX的前生今世 (http://blog.csdn.net/j080624/article/details/55101279)。知道了该对象,那么就可以通过判断请求头属性来鉴别当前请求:一次AJAX请求头如下:一次普通get请求如下:示例代码如下:String requestType = reques
如何判断一个请求是不是ajax请求
做个笔记记录下 省得以后忘 public boolean isAjaxRequest(HttpServletRequest request){ String header = request.getHeader(&quot;X-Requested-With&quot;); boolean isAjax = &quot;XMLHttpRequest&quot;.equals(header) ? true:fal...
python实现1分钟内股价波动邮件提示
python实现1分钟内股价波动邮件提示一、通过tushare接口实时监控股票价格1. 通过get_realtime_quotes获得股票的开盘价与实时价格2. 计算1min时间内的股价波动3. 编写自动定时函数实现固定1min间隔循环二、邮件提示1. 设置邮箱信息2. 通过SMTP工具发送邮件三、设置脚本运行时间范围1. 根据交易时间设置脚本开始和结束时间2. 以上证指数为例实现自动化交易时间内...
1分钟内清除OFFICE文档密码
可快速清除OFFICE密码,跟其它的破解密码不一样。他不会去用猜密码,而以直接去文当表头去密码,不破坏原有文件。。。。
Java程序调用自动关机指令 1分钟内自动关机
package com.swift;//可以不要这句 import java.io.IOException; public class Shutdown100 { public static void main(String[] args) { try { Runtime.getRuntime().exec("shutdown -s -t 60
如何实现一天之内对用户登录次数作限制?
在一天之内,如果某个用户登录的次数超过10次,就锁定.rnrn有没有这方面的资料(书)或者代码交流一下,谢谢!