参考的思路是 Servlet实现用户请求次数的统计
此文档的业务是统计请求次数,并没有限制次数。
需要掌握的内容:1,Session:生命周期,原理。发现除了HttpServletRequest,getSession() 。shiro框架也有Session:SecurityUtils.getSubject().getSession(),此次使用的Shiro框架的session,且查看了Shiro框架的SecurityUtils.getSubject().logout();【退出】功能的注释信息,调用该方法会删除session或者使session无效化。
Logs out this Subject and invalidates and/or removes any associated entities, such as a {@link Session Session} and authorization data.
解决方案:session维护一个Map<String ,Long>。
Map存两种信息,信息1:<第n次请求的n,时间戳>,信息2:<记录最大的n的key,比如maxCount,n>
/* 业务:限制1分钟内的请求次数,超出请求的限制次数,拒绝该请求
* map(k=session中用户的第n次请求,v=请求时的时间戳)以及保存一个请求次数(k = maxCount,v= 请求的最大数 )
* 1,判断session是否包含countTimeMap。是,计算100次请求的时间间隔,如果session里不足100次请求,忽略计算。
* 不包含countTimeMap,则初始化countTimeMap
* 2,判断100次请求时间间隔是否小于60S。是,拒绝该请求。
*/
计算时间间隔:
Long rfl = Long.parseLong(PropertiesUtil.get("REQUEST_FREQUENCY_LIMIT")); //读取配置文件的值
//
if (maxCount.longValue() >= rfl.longValue()) {
Long queryCount = maxCount - rfl + 1;
if (map.get(String.valueOf(queryCount)) != null) {
//计算时间间隔(秒)
interValMin =
(System.currentTimeMillis() - map.get(String.valueOf(queryCount))) / 1000;
}
}